Ir ao conteúdo
  • Cadastre-se

O Form fecha, mas continua no Gerenciador de Tar


Pulllga

Posts recomendados

Olá, sou o Pulllga (aff, de novo!!!),

Eu programando um software de gerenciamento de no-breaks, mas quando uso o Form::Close(); só o form fecha, mas as funções continuam rodando!!!

Antes de fechar o form, eu uso o return e o break da função, mas continua rodando e consumindo perto de 100% do processamento do PC!!!

Como posso terminar o programa???

Thank You... :D:D:D

Link para o comentário
Compartilhar em outros sites

Olá Eduardo, como sempre me ajudando...

O problema do meu programa, é que tenho uma função que fica lendo e enviando dados pela porta serial, essa função, tem um marcador de status da comunicação, essa variável é:

0 - Para abrir a porta e logar com o usuário

1 - Para logar com a senha

2 - Para pedir os dados

3 - Lê os dados e volta para o 2

4 - Inicia a desconexão

5 - Confirma a desconexão e fecha a porta serial, dá um "return", um "break" e fecha o form.

Esse é o problema, eu mudo o marcador para 4 quando quero fechar o form, ele executa todas as rotinas perfeitamente, mas executa o return e o break e continua funcionando, eternamente, parece que o break ou o return não funcionam!!!

Alguma ideia???

Brigado... :D:D:D

Link para o comentário
Compartilhar em outros sites

Olá, está todo comentado, deve ser fácil de entender, ele comunica com o no-break, recebe as informações, grava num buffer e exibe na tela, basicamente isso.

Quando enviado o valor 4 na função, ele fecha tudo (pelo menos deveria)!!!


void COLETOR(int c){
String ^buff, ^tmp, ^redBuff, ^saiBuff, ^batBuff, ^html;
int icone, x, janela, cErr;
float teste;

//Zera a variável de erro, considerando iniciar sem erro
erro = 0;
//Inicia a variável de icone em 1, indicando a posição inicial
//da animação do icone
icone = 1;
//Inicia a janela na condição 1, Maximizado, se for alterado para 2
//a janela inicia Reduzida
janela = 1;

//Abre a porta com selecionada na variável ups
if(porta < 16 && serPri->IsOpen == false){
   serPri->PortName = "Com" + Convert::ToString(porta);
   serPri->Open();
   c = 0;
   }

//Verifica se a porta está aberta
while(serPri->IsOpen == true){

   System::Windows::Forms::Application::DoEvents();
    
   if(serPri->IsOpen == true){
      //Preenche o buffer se houver algum dado vindo do No-Break
      while(serPri->BytesToRead > 0){
        buff = buff + Convert::ToString(Convert::ToChar(serPri->ReadChar()));
         }
      }

   //Inicia o processo de conexão e aquisição de dados
   if(buff->IsNullOrEmpty(buff) || cErr > 4){
      //Inicia a animação do ícona em caso de erro
      if(notPri->Visible == true){
         icone++;
         //...
         if(icone == 10){
            icone = 0;
            cErr++;
            if(buff->IsNullOrEmpty(buff) == true && dados.tRed != 0 && cErr > 5){
               if(c ==3){
                  serPri->WriteLine("");
                  c = 2;
                  }
               if(c == 2)
                  c = 3;
                 erro = 0;
               cErr = 0;
               }
            }
         }
      }
   else{
      if(notPri->Visible == true){
         //Atualiza o ícone da barra de tarefas, indicando que está tudo funcionando
         icone++;
         //...
         if(icone == 10)
            icone = 0;
         }

      if(buff->Contains("DESCONECTADO") && c != 5){
         c = 0;
         buff = System::String::Empty;
         }

      //Fecha o programa se Desconectado pelo botão Fechar
      if(buff->Contains("DESCONECTADO") && c == 5){
         buff = System::String::Empty;
         cErr = 0;
         serPri->WriteLine("");
         serPri->Close();
         frmPri::Close();
         ups = 0;
         return;
         break;
         }

      //Desconecta o No-Break
      if(buff->Contains("Opcao") && c == 4){
         serPri->WriteLine("");
         c = 5;
         buff = System::String::Empty;
         cErr = 0;
         }
      
      //Retorna ao menu principal para re-iniciar a aquisição de dados
      if(buff->Contains("oC") || buff->Contains("Desconectada") && c == 3 && buff->Length > 966){
         serPri->WriteLine("v");
         c = 2;
         cErr = 0;

         //Inicia a gravação do buffer definitivo contando que
         //seja da llinha HF
         if(ups == 1){
            frmPri::Width = 277;
            //Zera o Buffer definitivo
            for(x=0;x<4;x++){
               dados.fir[x] = Convert::ToChar("0");
               }
            dados.pn = 0;
            dados.fp = 0;
            dados.tRed = 0;
            dados.cRed = 0;
            dados.fRed = 0;
            dados.pvaRed = 0;
            dados.pwRed = 0;
            dados.fpRed = 0;
            dados.fcRed = 0;
            dados.rRed = 0;
            dados.fbRed = Convert::ToChar("0");
            dados.tSai = 0;
            dados.cSai = 0;
            dados.fSai = 0;
            dados.pvaSai = 0;
            dados.pwSai = 0;
            dados.fpSai = 0;
            dados.fcSai = 0;
            dados.caSai = 0;
             dados.tBat = 0;
            for(x=0;x<4;x++){
               dados.cBat[x] = Convert::ToChar("0");
               }
            dados.pBat = 0;
            dados.caBat = 0;
            dados.rBat = 0;
            dados.bbBat = 0;
            for(x=0;x<10;x++){
               dados.tpBat[x] = Convert::ToChar("0");
               }
            dados.crgBat = 0;
            dados.amBat = 0;
            dados.aaBat = 0;
            dados.eBat = 0;
            dados.eqBat = 0;
            for(x=0;x<10;x++){
               dados.teBat[x] = Convert::ToChar("0");
               }
            dados.tiBat = 0;
            dados.taBat = 0;
            dados.disp1 = Convert::ToChar("0");
            dados.disp2 = Convert::ToChar("0");

            redBuff = buff->Substring(buff->IndexOf("REDE"),buff->IndexOf("SAIDA") - 1);
            saiBuff = buff->Substring(buff->IndexOf("SAIDA"),(buff->IndexOf("BATERIAS") - buff->IndexOf("SAIDA")) - 1);
            batBuff = buff->Substring(buff->IndexOf("BATERIAS"),(buff->IndexOf("oC") - buff->IndexOf("BATERIAS")) - 1);

Link para o comentário
Compartilhar em outros sites

  • Membro VIP


      //Fecha o programa se Desconectado pelo botão Fechar
      if(buff->Contains("DESCONECTADO") && c == 5){
         buff = System::String::Empty;
         cErr = 0;
         serPri->WriteLine("");
         serPri->Close();
         frmPri::Close();//(1)
         ups = 0;
         return;
         break;//(2)
         }

1) Cuidado com esses operadores, o "::" só chama metodos estáticos, não esta passando a referência do seu form para a função, alias, você tem essa referência? Guarde ela em algum lugar e use "referencia->Close();", pela forma que o código esta organizado esse metódo pertence a classe frmPri, um "this->Close()" ou simplesmente "Close()" devem funcionar;

2) Esse break nunca sera executado, e tambem não precisa, o return sai da função do jeito que você espera sem nunca passar pelo break;

Link para o comentário
Compartilhar em outros sites

Olá Eduardo,

Eu sei que o "return" a principio não seria executado, não era pra ser executado, mas executa!!!

Esse é o problema, o form fecha certinho com o "::Close", sem problemas, o "break" executa e logo após o "return" também executa e a função continua rodando e se vou análisando o código com o f9, a função fica eternamente rodando e ocupando 99% do processamento do pc!!!

E todas as vezes que a função roda, ele executa o "::Close", o "break" e o "return"!!!

Isso é muito estranho, é como se a função rodasse e se chamasse automaticamente a cada vez que fecha ou como se o "break", "::Close" e "return" não funcionassem!!!

Alguma ideia?

valeu :D:D:D

Link para o comentário
Compartilhar em outros sites

Ok, vou testar hoje a tarde,

Vale lembrar um programa muito útil para trabalhar com APIs, o API Guide, ele lista todas dlls do systema, mostra todas as funções, as sintaxes e exemplos para cada dll.

Realmente muito útil, é só pegar uma dll, ver a função, e copiar o código do próprio API Guide, colar no programa e pronto!!!

falou :D:D:D

Link para o comentário
Compartilhar em outros sites

Meu código depois de corrigido, mas agora surgiu outro problema, a função roda sozinha!!!

Eu coloquei um timer, que pode ser configurado para rodar a função em intervalos de 2 segundos á 1 hora.

O timer está sempre certo, e cada vez que ele executa verifica se a função não está sendo executada e a executa.

Mas acontece que se eu executo a função, ao terminar, ela se chama novamente, sózinha, muito antes do timer executá-la!!!

Alguém tem ideia do que pode ser???

int COLETOR(){
String ^buff, ^tmp, ^redBuff, ^saiBuff, ^batBuff, ^html, ^ip, ^tmpConf;
int x, cErr, marLet, com, porta, inter, testeteste;
float teste;
char cTes[5];

//Zera a variável de erro, considerando iniciar sem erro
erro = 0;

fun = 1;

//Verifica se o arquivo de configuração existe, se sim, abre, lê e grava as configurações nas variáveis
if(System::IO::File::Exists(Application::StartupPath  + "/conf.ini") == true){
   tmpConf = System::IO::File::ReadAllText(Application::StartupPath + "/config.ini",System::Text::Encoding::GetEncoding("ISO-8859-1"));
   ups = Convert::ToInt32(tmpConf->Substring(tmpConf->IndexOf("[MODELO]") + 10,1));
   com = Convert::ToInt32(tmpConf->Substring(tmpConf->IndexOf("[COM]") + 7,2));
   porta = Convert::ToInt32(tmpConf->Substring(tmpConf->IndexOf("[TCP-PORTA]") + 13,5));
   inter = Convert::ToInt32(tmpConf->Substring(tmpConf->IndexOf("[INTERVALO]") + 13,7));
   ip = tmpConf->Substring(tmpConf->IndexOf("[TCP-IP]") + 10,15);
   }

inter2 = Convert::ToInt32(inter);

//Abre a porta com selecionada
if(porta < 16 && serPri->IsOpen == false){
   serPri->PortName = "Com" + Convert::ToString(com);
   serPri->Open();
   c = 0;
   }

//Verifica se a porta está aberta
while(serPri->IsOpen == true){

   System::Windows::Forms::Application::DoEvents();
    
   if(serPri->IsOpen == true){
      //Preenche o buffer se houver algum dado vindo do No-Break
      while(serPri->BytesToRead > 0){
         buff = buff + Convert::ToString(Convert::ToChar(serPri->ReadChar()));
         }
      }

   if(buff->IsNullOrEmpty(buff)){
      con = 1;
      }
   else{
      con = 0;
      }

   //Inicia o processo de conexão e aquisição de dados
   if(buff->IsNullOrEmpty(buff) || cErr > 4){
      cErr = cErr;
      }
   else{
      //cErr++;
      //Fecha o programa se Desconectado pelo botão Fechar
      if(c == 7 && buff->Contains("DESCONECTADO")){
         buff = "000";
         cErr = 0;
         ups = 0;
         c = 0;
         serPri->WriteLine("");
         timWait->Interval = inter;
         timWait->Enabled = true;
         frmPri::Close();
         fun = 0;
         break;
         }

      //Desconecta o No-Break
      if(c == 6){
         if(buff->Contains("Opcao")){
            serPri->WriteLine("");
            c = 7;
            buff = System::String::Empty;
            cErr = 0;
              }
         }

      //Fecha o programa se Desconectado pelo botão Fechar
      if(buff->Contains("DESCONECTADO")){
         buff = "000";
         cErr = 0;
         ups = 0;
         c = 0;
         serPri->WriteLine("");
         timWait->Interval = inter;
         timWait->Enabled = true;
         fun = 0;
         return(0);
         }

      //Desconecta o No-Break
      if(c == 4){
         if(buff->Contains("Opcao")){
            serPri->WriteLine("");
            c = 5;
            buff = System::String::Empty;
            cErr = 0;
            }
         }
      
      //Retorna ao menu principal para re-iniciar a aquisição de dados
      if( buff->Contains("Bateria Desconectada") || buff->Contains("oC") || buff->Contains("Desconectado") && c == 3 && buff->Length > 966){
         if(ups == 1){
            serPri->WriteLine("v");
            }
         if(ups == 2){
             serPri->WriteLine(Convert::ToString(Environment::ExitCode));
            }
         c = 4;
         cErr = 0;

Link para o comentário
Compartilhar em outros sites

Olá, estou com um problema neste trecho de código:


if(c == 5 && buff->Contains("DESCONECTADO")){
   buff = "000";
   cErr = 0;
   ups = 0;
   c = 8;
   nada = 0;
   serPri->WriteLine("");
   serPri->Close();
   timWait->Interval = inter;
   timWait->Enabled = true;
   nada = 0;
   buff = System::String::Empty;
   return(0);
   }

Também já tentei dessa forma:


if(c == 5 && buff->Contains("DESCONECTADO")){
   buff = "000";
   cErr = 0;
   ups = 0;
   c = 8;
   nada = 0;
   serPri->WriteLine("");
   serPri->Close();
   timWait->Interval = inter;
   timWait->Enabled = true;
   nada = 0;
   buff = System::String::Empty;
   return(0);
   }

E em nenhum dos casos funciona!!!

A função funciona quase perfeitamente, faz quase tudo como deveria fazer, a única coisa que não funciona é esse if, que é a última parte do código, onde zera todas as variáveis e encerra a comunicação do meu software, mas ao invés de sair da função, ele passa pelo return(0) e continua executando a função!!!

Como posso sair da função?

Existe outro método?

T+ :D:D:D

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Ola Pullga,

Acredito que seu ultimo tópico seja relacionado a esse outro, por isso juntei os dois, tambem editei os dois códigos longos por serem grandes demais, deixei apenas a parte funcional, tirei tudo que parecia ser específico da aplicação e não contribui para a solução do problema.

Agora ao problema,

já tentou um "MessageBox::Show(inter->ToString());"?

Link para o comentário
Compartilhar em outros sites

Olá, isto é um timer sim, ele que chama a função, se a mesma não estiver sendo executada, e funciona, porque a função nunca para de funcionar!!!

Já debuguei um monte, ele entra no timer e sai do if e não roda a função porque ela continua sendo executada desde a primeira vez que é chamada!!!

O que que eu faço???

valeu :D:D:D

Link para o comentário
Compartilhar em outros sites

Descobri o problema!!!

Agora o problema é: Como resolver este problema???

É nesse trecho de código:


//Verifica se a porta está aberta
while(serPri->IsOpen == true){

   System::Windows::Forms::Application::DoEvents(); <-- Aqui é o problema!!!
    
   if(serPri->IsOpen == true){
      //Preenche o buffer se houver algum dado vindo do No-Break
      while(serPri->BytesToRead > 0){
         buff = buff + Convert::ToString(Convert::ToChar(serPri->ReadChar()));
         }
      }

O que acontece, eu coloquei aquele comando para o while permitir que outras funções e componentes continuem funcionando.

Mas mesmo assim, a função não deveria re-iniciar!!!

Se observar o código completo da função, se o buffer estiver com algum conteúdo, a função executa o if que compara c com 0, depois compara c com 1 com uma string, depois compara c com 2 e uma string, depois lê todos os dados, logo após compara c com 4 e envia o comando esc, depois compara c com 5 e fecha comunicação.

Mas exatamente na hora que ele lê os dados, quando c está em 3, a função inicia tudo de novo!!!

Fazendo com que o c e algumas outras variáveis, mudem de valor quando não deveriam!!!

Alguém tem alguma ideia???

Ah, tentei o msg box sim, ele entra no if!

Obrigao... :D:D:D

Link para o comentário
Compartilhar em outros sites

Olá,

O nome da função é COLETOR, ela só é chamada dentro do timer que tem tempo configurado, no timer, há um if verificando se a função está ou não ativa, no inicio da função, tem uma variável que muda para 1, quando a função encerra, ela muda pra 0, indicando se a função está rodando ou não, somente se a função estiver rodando que o timer vai chamá-la.

O timer pode ser configurado para que a aquisição dos dados do no-break possa ser feita em intervalos de tempo personalizáveis, de 2 segundos a 1 hora.

Por isso preciso que a função execute, colete todos os dados e pare, ai no momento que o timer passar o tempo determinado, ele chama a função novamente e repete todo o processo.

Se eu colocar o exit como o colega sugeriu, eu saio do programa, e com certeza não é isso que eu quero.

O DoEvents precisa existir para que o timer continue sempre executando para determinar o tempo de coleta dos dados, porque senão, no caso de um tempo de aquisição menor ou igual a 6, o timer executária tantas vezes seguidas em um intervalo de tempo tão pequeno, que ocuparia o pc o tempo todo e o computador ficaria inútilizavel!

Não tem como reduzir o consumo de cpu, porque o firmware do no-break é pobre, a rotina de transmissão e envio das informações é precária e ocupa muito o pc.

Além de ter um outro timer para cuidar da função de letreiro que fica exibindo as informações em uma única linha que fica rolando na tela e animando o ícone na barra de tarefas, indicando se a comunicação com o no-break está ok ou não.

Alguém tem alguma ideia de como evitar que a função auto-execute???

Repitindo o código, agora comentado, e com pequenas correções:


//Função responsável por conectar no no-break correto, com o modo de conexão

//selecionado, adquirir os dados, filtrá-los, exibilos, armazená-los

//em buffer, armazenar em banco de dados, desconectar e limpar tudo para a

//o próximo interválo de leituras.

int COLETOR(){

String ^buff, ^tmp, ^redBuff, ^saiBuff, ^batBuff, ^html, ^ip, ^tmpConf;

int x, cErr, marLet, com, porta, inter, testeteste, x1,x2,x3,x4;

float teste;

char cTes[5];

if(c == 0){

   buff = System::String::Empty;

   }

//Zera a variável de erro, considerando iniciar sem erro

erro = 0;

//Inicia o verificador de função

//0 : Função inativa

//1 : Função em andamento

nada = 1;

tmpConf = System::String::Empty;

ups = 0;

com = 0;

   porta = 0;

   inter = 0;

   ip = System::String::Empty;

   inter2 = 0;

   //Verifica se o arquivo de configuração existe, se sim, abre, lê e grava

   //as configurações nas variáveis

   if(System::IO::File::Exists(Application::StartupPath  + "/config.ini") == true){

      //Variável temporária do buffer

      tmpConf = System::IO::File::ReadAllText(Application::StartupPath + "/config.ini",System::Text::Encoding::GetEncoding("ISO-8859-1"));

      //Variável que armazena o tipo de no-break conectado

      ups = Convert::ToInt32(tmpConf->Substring(tmpConf->IndexOf("[MODELO]") + 10,1));

      //Variável que armazena a porta em que´o no-break está conectado

      com = Convert::ToInt32(tmpConf->Substring(tmpConf->IndexOf("[COM]") + 7,2));

      //Variável que armazena a porta onde o no-break está conectado

      porta = Convert::ToInt32(tmpConf->Substring(tmpConf->IndexOf("[TCP-PORTA]") + 13,5));

      //Variável que armazena o intervalo de leitura dos dados

      inter = Convert::ToInt32(tmpConf->Substring(tmpConf->IndexOf("[iNTERVALO]") + 13,7));

      //Variável que armazena o ip de conexão com o no-break

      ip = tmpConf->Substring(tmpConf->IndexOf("[TCP-IP]") + 10,15);

      }

   //Converssão do intervalo para um tipo adequado ao Timer

   //inter2 = Convert::ToInt32(inter);

   //Abre a porta com selecionada

   if(porta < 16 && serPri->IsOpen == false){

      serPri->PortName = "Com" + Convert::ToString(com);

      serPri->Open();

      c = 0;

      }

   }

//Verifica se a porta está aberta

while(serPri->IsOpen == true){

   if(c != 3){

      //Permite executar as outras funções e processos do programa sem que

      //o laço while interfira

      System::Windows::Forms::Application::DoEvents();

      }

    

   //Verifica se a porta está aberta, se sim, lê os dados

   if(serPri->IsOpen == true){

      //Preenche o buffer se houver algum dado vindo do No-Break

      while(serPri->BytesToRead > 0){

         buff = buff + Convert::ToString(Convert::ToChar(serPri->ReadChar()));

         }

      }

   //Verifica se houve leitura de dados e grava na variável

   //0 : Com leitura, o ícone da taskbar fica azul

   //1 : Sem leitura, o ícone da taskbar fica vermelho

   if(buff->IsNullOrEmpty(buff)){

      con = 1;

      }

   else{

      con = 0;

      }

   //Inicia o processo de conexão e aquisição de dados

   if(buff->IsNullOrEmpty(buff) == false && c == 3){

      //Retorna ao menu principal para re-iniciar a aquisição de dados

      if( buff->Contains("Bateria Desconectada") || buff->Contains("oC") || buff->Contains("Desconectado") && c == 3 && buff->Length > 966){

         try{

         //Inicia a gravação do buffer definitivo contando que

         //seja da linha HF

         if(ups == 1){

            frmPri::Width = 277;

            //Zera o Buffer definitivo

            for(x=0;x<4;x++){

               dados.fir[x] = Convert::ToChar("0");

               }

            dados.pn = 0;

            dados.fp = 0;

            dados.tRed = 0;

            dados.cRed = 0;

            dados.fRed = 0;

            dados.pvaRed = 0;

            dados.pwRed = 0;

            dados.fpRed = 0;

            dados.fcRed = 0;

            dados.rRed = 0;

            dados.fbRed = Convert::ToChar("0");

            dados.tSai = 0;

            dados.cSai = 0;

            dados.fSai = 0;

            dados.pvaSai = 0;

            dados.pwSai = 0;

            dados.fpSai = 0;

            dados.fcSai = 0;

            dados.caSai = 0;

             dados.tBat = 0;

            for(x=0;x<4;x++){

               dados.cBat[x] = Convert::ToChar("0");

               }

            dados.pBat = 0;

            dados.caBat = 0;

            dados.rBat = 0;

            dados.bbBat = 0;

            for(x=0;x<10;x++){

               dados.tpBat[x] = Convert::ToChar("0");

               }

            dados.crgBat = 0;

            dados.amBat = 0;

            dados.aaBat = 0;

            dados.eBat = 0;

            dados.eqBat = 0;

            for(x=0;x<10;x++){

               dados.teBat[x] = Convert::ToChar("0");

               }

            dados.tiBat = 0;

            dados.taBat = 0;

            dados.disp1 = Convert::ToChar("0");

            dados.disp2 = Convert::ToChar("0");

        

            redBuff = buff->Substring(buff->IndexOf("REDE"),buff->IndexOf("SAIDA") - 1);

            saiBuff = buff->Substring(buff->IndexOf("SAIDA"),(buff->IndexOf("BATERIAS") - buff->IndexOf("SAIDA")) - 1);

            batBuff = buff->Substring(buff->IndexOf("BATERIAS"),(buff->IndexOf("oC") - buff->IndexOf("BATERIAS")) - 1);

            //Preenchimento do Buffer definitivo

            //Grava os dados do equipamento

            if(buff->IndexOf("Firmware: ") != 0){

               for(x=0;x<4;x++){

                  dados.fir[x] = Convert::ToChar(buff->Substring(buff->IndexOf("Firmware: ") + 9 + (x + 1),1));

                  }

                lblFir->Text = buff->Substring(buff->IndexOf("Firmware: ") + 10,4);

               tmp = lblFir->Text;

               tmp = tmp->Trim();

               //Identifica pelo firmware se o no-break é da linha HF

               if(tmp->Length == 3){

                  lblSig->Text = "HF";

                  }

               //Identifica pelo firmware se o no-break é da linha M

               if(tmp->Length == 4){

                  lblSig->Text = "M";

                  }

                }

            if(buff->IndexOf("Potencia Nominal = ") != 0){

               dados.pn = Convert::ToDouble(buff->Substring(buff->IndexOf("Potencia Nominal = ") + 19,4));

               }

            if(buff->IndexOf("Fat.Pot.= ") != 0){

               dados.fp = Convert::ToDouble(buff->Substring(buff->IndexOf("Fat.Pot.= ") + 10,3));

               }

            //Grava os dados da Rede

            //Tensão

            if(redBuff->IndexOf("tensão  = ") != 0){

               tmp = redBuff->Substring(redBuff->IndexOf("tensão  = ") + 10,5);

               tmp = tmp->Remove(tmp->Length - 2,1);

               tmp = tmp->Insert(tmp->Length - 1,",");

               dados.tRed = Convert::ToDouble(tmp);

               }

            //Corrente

            if(redBuff->IndexOf("Corrente= ") != 0){

               tmp = redBuff->Substring(redBuff->IndexOf("Corrente= ") + 10,5);

               tmp = tmp->Remove(tmp->Length - 2,1);

               tmp = tmp->Insert(tmp->Length - 1,",");

               dados.cRed = Convert::ToDouble(tmp);

               }

            //Frequência

            if(redBuff->IndexOf("Freq.= ") != 0){

               tmp = redBuff->Substring(redBuff->IndexOf("Freq.= ") + 7,4);

               tmp = tmp->Remove(tmp->Length - 2,1);

               tmp = tmp->Insert(tmp->Length -1,",");

               dados.fRed = Convert::ToDouble(tmp);

               }

            //Potência VA

            if(redBuff->IndexOf("Pot.(VA)= ") != 0){

               tmp = redBuff->Substring(redBuff->IndexOf("Pot.(VA)= ") + 10,5);

               tmp = tmp->Remove(tmp->Length - 3,1);

               tmp = tmp->Insert(tmp->Length -2,",");

               dados.pvaRed = Convert::ToDouble(tmp);

               }

            //Potência W

            if(redBuff->IndexOf("Pot.(W) = ") != 0){

               tmp = redBuff->Substring(redBuff->IndexOf("Pot.(W) = ") + 10,5);

               tmp = tmp->Remove(tmp->Length - 3,1);

               tmp = tmp->Insert(tmp->Length -2,",");

               dados.pwRed = Convert::ToDouble(tmp);

               }

            //Fator de Potência

            if(redBuff->IndexOf("Fat.Pot.= ") != 0){

               tmp = redBuff->Substring(redBuff->IndexOf("Fat.Pot.= ") + 10,4);

               tmp = tmp->Remove(tmp->Length - 3,1);

               tmp = tmp->Insert(tmp->Length -2,",");

               dados.fpRed = Convert::ToDouble(tmp);

               }

            //Fator de Crista

            if(redBuff->IndexOf("Fat.Crista= ") != 0){

                 tmp = redBuff->Substring(redBuff->IndexOf("Fat.Crista= ") + 12,3);

               tmp = tmp->Remove(tmp->Length - 2,1);

               tmp = tmp->Insert(tmp->Length -1,",");

               dados.fcRed = Convert::ToDouble(tmp);

               }

            //Rendimento

            if(redBuff->IndexOf("Rendimento= ") != 0){

               dados.rRed = Convert::ToInt32(redBuff->Substring(redBuff->IndexOf("Rendimento= ") + 12,3));

               }

            //Fase de Bypass

            if(redBuff->IndexOf("Fase p/ Bypass:  ") != 0){

               dados.fbRed = Convert::ToChar(redBuff->Substring(redBuff->IndexOf("Fase p/ Bypass:  ") + 17,1));

               }

            //Grava os dados da Saída

            //Tensão

            if(saiBuff->IndexOf("tensão  = ") != 0){

               tmp = saiBuff->Substring(saiBuff->IndexOf("tensão  = ") + 10,5);

               tmp = tmp->Remove(tmp->Length - 2,1);

               tmp = tmp->Insert(tmp->Length - 1,",");

               dados.tSai = Convert::ToDouble(tmp);

               }

            //Corrente

            if(saiBuff->IndexOf("Corrente= ") != 0){

               tmp = saiBuff->Substring(saiBuff->IndexOf("Corrente= ") + 10,5);

               tmp = tmp->Remove(tmp->Length - 2,1);

               tmp = tmp->Insert(tmp->Length - 1,",");

               dados.cSai = Convert::ToDouble(tmp);

               }

            //Frequência

            if(saiBuff->IndexOf("Freq.= ") != 0){

               tmp = saiBuff->Substring(saiBuff->IndexOf("Freq.= ") + 7,4);

               tmp = tmp->Remove(tmp->Length - 2,1);

               tmp = tmp->Insert(tmp->Length -1,",");

               dados.fSai = Convert::ToDouble(tmp);

               }

            //Potência VA

            if(saiBuff->IndexOf("Pot.(VA)= ") != 0){

               tmp = saiBuff->Substring(saiBuff->IndexOf("Pot.(VA)= ") + 10,5);

               tmp = tmp->Remove(tmp->Length - 3,1);

               tmp = tmp->Insert(tmp->Length -2,",");

               dados.pvaSai = Convert::ToDouble(tmp);

               }

            //Potência W

            if(saiBuff->IndexOf("Pot.(W) = ") != 0){

               tmp = saiBuff->Substring(saiBuff->IndexOf("Pot.(W) = ") + 10,5);

               tmp = tmp->Remove(tmp->Length - 3,1);

               tmp = tmp->Insert(tmp->Length -2,",");

               dados.pwSai = Convert::ToDouble(tmp);

               }

            //Fator de Potência

            if(saiBuff->IndexOf("Fat.Pot.= ") != 0){

               tmp = saiBuff->Substring(saiBuff->IndexOf("Fat.Pot.= ") + 10,4);

               tmp = tmp->Remove(tmp->Length - 3,1);

               tmp = tmp->Insert(tmp->Length -2,",");

               dados.fpSai = Convert::ToDouble(tmp);

               }

            //Fator de Crista

            if(saiBuff->IndexOf("Fat.Crista= ") != 0){

               tmp = saiBuff->Substring(saiBuff->IndexOf("Fat.Crista= ") + 12,3);

               tmp = tmp->Remove(tmp->Length - 2,1);

               tmp = tmp->Insert(tmp->Length -1,",");

               dados.fcSai = Convert::ToDouble(tmp);

               }

            //Carga

            if(buff->IndexOf("Carga= ") != 0){

               dados.caSai = Convert::ToInt32(saiBuff->Substring(saiBuff->IndexOf("Carga= ") + 7,3));

               }

            //Grava os dados das Baterias

            //Tensão

            if(batBuff->IndexOf("tensão= ") != 0){

               tmp = batBuff->Substring(batBuff->IndexOf("tensão= ") + 8,5);

               tmp = tmp->Remove(tmp->Length - 2,1);

               tmp = tmp->Insert(tmp->Length - 1,",");

               dados.tBat = Convert::ToDouble(tmp);

               }

            //Corrente

            if(batBuff->IndexOf("Corrente= ") != 0){

               for(x=0;x<5;x++){

                    dados.cBat[x] = Convert::ToChar(batBuff->Substring(batBuff->IndexOf("Corrente= ") + 10 + x,1));

                  }

               }

            //Potência

            if(batBuff->IndexOf("Pot.= ") != 0){

               dados.pBat = Convert::ToInt32(batBuff->Substring(batBuff->IndexOf("Pot.= ") + 6,6));

               }

            //Carga

            if(batBuff->IndexOf("Carga= ") != 0){

               dados.caBat = Convert::ToInt32(batBuff->Substring(batBuff->IndexOf("Carga= ") + 7,3));

               }

            //Rendimento

            if(batBuff->IndexOf("Rendimento= ") != 0){

               dados.rBat = Convert::ToInt32(batBuff->Substring(batBuff->IndexOf("Rendimento= ") + 12,2));

               }

            //Banco de Baterias

            if(batBuff->IndexOf("Banco de Baterias= ") != 0){

               dados.bbBat = Convert::ToInt32(batBuff->Substring(batBuff->IndexOf("Banco de Baterias= ") + 19,3));

               }

            //Tipo

            if(batBuff->IndexOf("Tipo: ") != 0){

               for(x=0;x<12;x++){

                  dados.tpBat[x] = Convert::ToChar(batBuff->Substring(batBuff->IndexOf("Tipo: ") + 6 + x,1));

                  }

               }

            //Carregador

            if(batBuff->IndexOf("Carregador: ") != 0){

               dados.crgBat = Convert::ToInt32(batBuff->Substring(batBuff->IndexOf("Carregador: ") + 12,1));

               }

            //Autonomia máxima a plena carga

            if(batBuff->IndexOf("Autonomia maxima a plena carga= ") != 0){

               dados.amBat = Convert::ToInt32(batBuff->Substring(batBuff->IndexOf("Autonomia maxima a plena carga= ") + 32,3));

               }

            //Autonomia atual

            if(batBuff->IndexOf("Autonomia atual= ") != 0){

               dados.aaBat = Convert::ToInt32(batBuff->Substring(batBuff->IndexOf("Autonomia atual= ") + 17,4));

               }

            //Estado

            if(batBuff->IndexOf("Estado= ") != 0){

                  dados.eBat = Convert::ToInt32(batBuff->Substring(batBuff->IndexOf("Estado= ") + 8,3));

               }

            //Equivalente

            if(batBuff->IndexOf("Equivalente= ") != 0){

               tmp = batBuff->Substring(batBuff->IndexOf("Equivalente= ") + 13,5);

               tmp = tmp->Remove(tmp->Length - 2,1);

               tmp = tmp->Insert(tmp->Length - 1,",");

               dados.eqBat = Convert::ToDouble(tmp);

               }

            //Teste

            if(batBuff->IndexOf("Teste= ") != 0){

               for(x=0;x<10;x++){

                  dados.teBat[x] = Convert::ToChar(batBuff->Substring(batBuff->IndexOf("Teste= ") + 7 + x,1));

                  }

               }

            //Temperatura IGBTs

            if(batBuff->IndexOf("Temperatura IGBTs= ") != 0){

               dados.tiBat = Convert::ToInt32(batBuff->Substring(batBuff->IndexOf("Temperatura IGBTs= ") + 19,2));

               }

            //Temperatura Ambiente

            if(batBuff->IndexOf("Temperatura Ambiente= ") != 0){

               dados.taBat = Convert::ToInt32(batBuff->Substring(batBuff->IndexOf("Temperatura Ambiente= ") + 22,2));

               }

            picIGB->Height = Convert::ToInt32(batBuff->Substring(batBuff->IndexOf("Temperatura IGBTs= ") + 19,2));

            lblIGB->Text = batBuff->Substring(batBuff->IndexOf("Temperatura IGBTs= ") + 19,2);

            picIGB->Top = 24 + (100 - picIGB->Height);

            if(picIGB->Height < 50){

               picIGB->BackColor = System::Drawing::Color::LightGreen;

               }

            if(picIGB->Height >= 50 && picIGB->Height < 70){

               picIGB->BackColor = System::Drawing::Color::LightYellow;

               }

            if(picIGB->Height >= 70){

               picIGB->BackColor = System::Drawing::Color::Red;

               }

            picAmb->Height = Convert::ToInt32(batBuff->Substring(batBuff->IndexOf("Temperatura Ambiente= ") + 22,2));

            lblAmb->Text = batBuff->Substring(batBuff->IndexOf("Temperatura Ambiente= ") + 22,2);

            picAmb->Top = 24 + (100 - picAmb->Height);

            if(picAmb->Height < 50){

               picAmb->BackColor = System::Drawing::Color::LightGreen;

               }

            if(picAmb->Height >= 50 && picIGB->Height < 70){

               picAmb->BackColor = System::Drawing::Color::LightYellow;

               }

            if(picAmb->Height >= 70){

               picAmb->BackColor = System::Drawing::Color::Red;

               }

            buff = "000";

            }

         //Grava o buffer definitivo com os dados do no-break

         //se o mesmo for da linha M

         if(ups == 2){

            frmPri::Width = 238;

            //Zera o Buffer definitivo

            for(x=0;x<4;x++){

               dados.fir[x] = Convert::ToChar("0");

               }

            dados.pn = 0;

            dados.fp = 0;

            dados.tRed = 0;

            dados.cRed = 0;

            dados.fRed = 0;

            dados.pvaRed = 0;

            dados.pwRed = 0;

            dados.fpRed = 0;

            dados.fcRed = 0;

            dados.rRed = 0;

            dados.fbRed = Convert::ToChar("0");

            dados.tSai = 0;

            dados.cSai = 0;

            dados.fSai = 0;

            dados.pvaSai = 0;

            dados.pwSai = 0;

            dados.fpSai = 0;

            dados.fcSai = 0;

            dados.caSai = 0;

             dados.tBat = 0;

            for(x=0;x<4;x++){

               dados.cBat[x] = Convert::ToChar("0");

               }

            dados.pBat = 0;

            dados.caBat = 0;

            dados.rBat = 0;

            dados.bbBat = 0;

            for(x=0;x<10;x++){

               dados.tpBat[x] = Convert::ToChar("0");

               }

            dados.crgBat = 0;

            dados.amBat = 0;

            dados.aaBat = 0;

            dados.eBat = 0;

            dados.eqBat = 0;

            for(x=0;x<10;x++){

               dados.teBat[x] = Convert::ToChar("0");

               }

            dados.tiBat = 0;

            dados.taBat = 0;

            dados.disp1 = Convert::ToChar("0");

            dados.disp2 = Convert::ToChar("0");

            redBuff = buff->Substring(buff->IndexOf("Rede:"),buff->IndexOf("Saida:") - 1);

            saiBuff = buff->Substring(buff->IndexOf("Saida:"),(buff->IndexOf("Bateria:") - buff->IndexOf("Saida:")) - 1);

            batBuff = buff->Substring(buff->IndexOf("Bateria:"),(buff->IndexOf("PAINEL") - buff->IndexOf("Bateria:")) - 1);

            //Preenchimento do Buffer definitivo

            //Grava os dados do equipamento

            if(buff->IndexOf("Firmware: ") != 0){

               for(x=0;x<4;x++){

                  dados.fir[x] = Convert::ToChar(buff->Substring(buff->IndexOf("Firmware: ") + 9 + (x + 1),1));

                  }

                lblFir->Text = buff->Substring(buff->IndexOf("Firmware: ") + 10,4);

               tmp = lblFir->Text;

               tmp = tmp->Trim();

               //Identifica pelo firmware se o no-break é da linha HF

               if(tmp->Length == 3){

                  lblSig->Text = "HF";

                  }

               //Identifica pelo firmware se o no-break é da linha M

               if(tmp->Length == 4){

                  lblSig->Text = "M";

                  }

                }

            if(buff->IndexOf("Potencia Nominal = ") != 0){

               dados.pn = Convert::ToDouble(buff->Substring(buff->IndexOf("Potencia Nominal = ") + 19,3));

               }

            //Este campo foi re-aproveitado para gravar a Potência Útil

            if(buff->IndexOf("Potencia Util= ") != 0){

               dados.fp = Convert::ToDouble(buff->Substring(buff->IndexOf("Potencia Util= ") + 15,3));

               }

            //Grava os dados da Rede

            //Tensão

            if(redBuff->IndexOf("tensão  = ") != 0){

               tmp = redBuff->Substring(redBuff->IndexOf("tensão  = ") + 10,5);

               tmp = tmp->Remove(tmp->Length - 2,1);

               tmp = tmp->Insert(tmp->Length - 1,",");

               dados.tRed = Convert::ToDouble(tmp);

               }

            //Corrente

            if(redBuff->IndexOf("Corrente= ") != 0){

               tmp = redBuff->Substring(redBuff->IndexOf("Corrente= ") + 10,6);

               tmp = tmp->Remove(tmp->Length - 3,1);

               tmp = tmp->Insert(tmp->Length - 2,",");

               dados.cRed = Convert::ToDouble(tmp);

               }

            //Frequência

            if(redBuff->IndexOf("Freq.= ") != 0){

               tmp = redBuff->Substring(redBuff->IndexOf("Freq.= ") + 7,4);

               tmp = tmp->Remove(tmp->Length - 2,1);

               tmp = tmp->Insert(tmp->Length -1,",");

               dados.fRed = Convert::ToDouble(tmp);

               }

            //Potência VA

            if(redBuff->IndexOf("Pot.(VA)= ") != 0){

               tmp = redBuff->Substring(redBuff->IndexOf("Pot.(VA)= ") + 10,5);

               tmp = tmp->Remove(tmp->Length - 3,1);

               tmp = tmp->Insert(tmp->Length -2,",");

               dados.pvaRed = Convert::ToDouble(tmp);

               }

            //Potência W

            if(redBuff->IndexOf("Pot.(W) = ") != 0){

               tmp = redBuff->Substring(redBuff->IndexOf("Pot.(W) = ") + 10,5);

               tmp = tmp->Remove(tmp->Length - 3,1);

               tmp = tmp->Insert(tmp->Length -2,",");

               dados.pwRed = Convert::ToDouble(tmp);

               }

            //Fator de Potência

            if(redBuff->IndexOf("Fat.Pot.= ") != 0){

               tmp = redBuff->Substring(redBuff->IndexOf("Fat.Pot.= ") + 10,4);

               tmp = tmp->Remove(tmp->Length - 3,1);

               tmp = tmp->Insert(tmp->Length -2,",");

               dados.fpRed = Convert::ToDouble(tmp);

               }

            //Grava os dados da Saída

            //Tensão

            if(saiBuff->IndexOf("c") != 0){

               tmp = saiBuff->Substring(saiBuff->IndexOf("tensão  = ") + 10,5);

               tmp = tmp->Remove(tmp->Length - 2,1);

               tmp = tmp->Insert(tmp->Length - 1,",");

               dados.tSai = Convert::ToDouble(tmp);

               }

            //Corrente

            if(saiBuff->IndexOf("Corrente= ") != 0){

               tmp = saiBuff->Substring(saiBuff->IndexOf("Corrente= ") + 10,6);

               tmp = tmp->Remove(tmp->Length - 3,1);

               tmp = tmp->Insert(tmp->Length - 2,",");

               dados.cSai = Convert::ToDouble(tmp);

               }

            //Frequência

            if(saiBuff->IndexOf("Freq.= ") != 0){

               tmp = saiBuff->Substring(saiBuff->IndexOf("Freq.= ") + 7,4);

               tmp = tmp->Remove(tmp->Length - 2,1);

               tmp = tmp->Insert(tmp->Length -1,",");

               dados.fSai = Convert::ToDouble(tmp);

               }

            //Potência VA

            if(saiBuff->IndexOf("Pot.(VA)= ") != 0){

               tmp = saiBuff->Substring(saiBuff->IndexOf("Pot.(VA)= ") + 10,5);

     &n

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Vou chutar a bola pra fora do estádio outra vez...

Já verificou em todo o código se em algum ponto dele, a variável "nada" está tendo seu valor resetado para "0" (quando deveria manter "1" até o final)?

Ah, e até onde eu sei, o timer é independente da aplicação, justamente para não fornecer medidas de tempo erradas em decorrencia de atrasos dentro daquela instância.

Então o DoEvents ali eu acho que é desnecessário, a não ser que você fosse escrever alguma coisa para interromper a execução da estrutura "while" (por exemplo, teclar ESC para sair, ou coisa assim).

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...