Como fazer um gráfico que se atualiza com outro aplicativo?

23/02/2009

1

Pessoal, minha dúvida é a seguinte:

Estou fazendo uma interface em Builder C++ para um programa de simulação de mecanica dos fluidos. Em uma determinada parte do programa eu criei um botão com o nome ´calcular´. Este botão é responsável por abrir um outro aplicativo (um arquivo exe já compilado) que faz os cálculos e salva os resultados em um arquivo .dat. Agora eu gostaria que quando eu clicasse nesse botão ´calcular´ uma janela abrisse e um gráfico fosse plotado enquanto o outro aplicativo faz os cálculos. O problema é que a janela com o gráfico só abre após o exe terminar os cálculos ou então (qdo eu inverto a ordem das linhas) a janela do gráfico abre primeiro mas os cálculos só começam se eu fechar essa janela. Alguém sabe como solucionar isso ou algum outro método de fazer?

Abaixo está o código do programa:

void __fastcall TForm1::Button4Click(TObject *Sender)
{
AnsiString tituloin;
AnsiString complemento = "tempB.dat";
AnsiString final;
tituloin=Edit13->Text;
final = tituloin + complemento;
Acomp->Edit1->Text=final;
system("cmd.exe /C CCCar3D.exe");
Acomp->ShowModal();
}


A primeira parte do código acima serve para criar a string de onde vou pegar o nome do arquivo que contém os resultados.

__fastcall TAcomp::TAcomp(TComponent* AOwner)
: TForm(AOwner)
{
FILE *file;
int i, j, nlin=0, ncol=13, ch, prev = ´\n´;
double **v;
AnsiString final;
char titulo[30];
final = Edit1->Text;
strcpy(titulo,final.c_str());
file=fopen(titulo,"r");

while (file)
{
while ( (ch = fgetc(file)) != EOF )
{
if (ch == ´\n´)
{
nlin++;
}
prev = ch;
}
fclose(file);
if (prev != ´\n´)
{
nlin++;
}
}
file = fopen(titulo, "r");
v =(double **) malloc (nlin * sizeof(double *));
for (i = 0; i < nlin; i++)
v[i] =(double *) malloc (ncol * sizeof(double));

for (i = 0; i < nlin; i++)
for (j = 0; j < ncol; j++)
fscanf(file, "¬lf", &v[i][j]);
fclose(file);

Acomp->Series1->Clear();
Acomp->Series2->Clear();
for (i=0; i<nlin ;i++)
{
Acomp->Series1->AddXY(v[i][0],v[i][1],"",clRed);
Acomp->Series2->AddXY(v[i][0],v[i][1],"",clBlue);
}

}



Responder

Posts

27/02/2009

Rogerbp

O problema é que sua chamada do executável fica aguardando até ele terminar.
Na linha
system("cmd.exe /C CCCar3D.exe"); 

substitui o system por ShellExecute
Vê se assim funciona.


Responder

13/04/2009

Sergioaav

Desculpe pela demora em responder. A linha de comando acima fez com que os dois executassem ao mesmo tempo, o que resolve parte do problema.
O problema agora é que os dois abrem juntos, o exe faz os cálculos mas a janela do gráfico não está fazendo a plotagem. Alguém sabe o pq?

O código ficou assim:

void __fastcall TForm1::Button4Click(TObject *Sender)
{
AnsiString tituloin;
AnsiString complemento = "tempB.dat";
AnsiString final;
tituloin=Edit13->Text;
final = tituloin + complemento;
Acomp->Edit1->Text=final;
ShellExecute(NULL, "open","CCCar3D.exe", "", NULL, SW_SHOWNORMAL);

Acomp->ShowModal();
}


Abaixo está o código da janela do gráfico que deveria fazer a plotagem:
__fastcall TAcomp::TAcomp(TComponent* AOwner)
: TForm(AOwner)
{
FILE *file;
int i, j, nlin=0, ncol=13, ch, prev = ´\n´;
double **v;
AnsiString final;
char titulo[30];
final = Edit1->Text;
strcpy(titulo,final.c_str());
file=fopen(titulo,"r");

while (file)
{
while ( (ch = fgetc(file)) != EOF )
{
if (ch == ´\n´)
{
nlin++;
}
prev = ch;
}
fclose(file);
if (prev != ´\n´)
{
nlin++;
}
}
file = fopen(titulo, "r");
v =(double **) malloc (nlin * sizeof(double *));
for (i = 0; i < nlin; i++)
v[i] =(double *) malloc (ncol * sizeof(double));

for (i = 0; i < nlin; i++)
for (j = 0; j < ncol; j++)
fscanf(file, "¬lf", &v[i][j]);
fclose(file);

Acomp->Series1->Clear();
Acomp->Series2->Clear();
for (i=0; i<nlin ;i++)
{
Acomp->Series1->AddXY(v[i][0],v[i][1],"",clRed);
Acomp->Series2->AddXY(v[i][0],v[i][1],"",clBlue);
}

}



Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira