Como fazer um gráfico que se atualiza com outro aplicativo?
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:
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.
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); } }
Sergioaav
Curtidas 0
Respostas
Rogerbp
23/02/2009
O problema é que sua chamada do executável fica aguardando até ele terminar.
Na linha
substitui o system por ShellExecute
Vê se assim funciona.
Na linha
system("cmd.exe /C CCCar3D.exe");
substitui o system por ShellExecute
Vê se assim funciona.
GOSTEI 0
Sergioaav
23/02/2009
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:
Abaixo está o código da janela do gráfico que deveria fazer a plotagem:
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); } }
GOSTEI 0