Toon posts:

[C++] Problemen met realtime refreshen van GUI (vcl)

Pagina: 1
Acties:
  • 159 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hoi!

Ik probeer een tool te ontwikkelen in C++ (Borland compiler 6) wat realtime bepaalde commando's uit een file in leest en deze uitvoert met het system() commando. Nu heb ik bepaalde panels gemaakt in een form die van rood naar groen moeten springen als het uitvoeren succesvol is verlopen. De code hiervan werkt als ik het systeem commando in de loop uit schakel, dan worden alle knopjes na het inlezen netjes stuk voor stuk groen. Echter, als ik het systeem commando weer aan zet, worden ze pas na het uitvoeren van alle commando's groen en niet per commando. Ik vermoed dat het refresh commando wat ik aan roep op de stack wordt gegooid door Windows en niet meteen wordt uitgevoerd. Weet iemand hoe je dit kan forceren?

(ik heb al Repaint(), Update(), Refresh(), SetFocus() en Invalidate() geprobeerd en werken helaas ook niet)

Het gaat om dit stukje code:

while((!inf.getline(cCommand, 2048).eof()))
{
Memo2->Text=cCommand;
Memo2->Refresh();

// Perform command
StaticText6->Caption="Running reconstruction...";
system(cCommand);
// Change colour of relevant button
if (!strncmp(cCommand, mCopy, 3))
{
Panel7->Color=clLime;
Panel7->Refresh();
}
if (!strncmp(cCommand, mHist, lenBins))
{
Panel8->Color=clLime;
Panel8->Refresh();
}
}

Alvast bedankt!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20-02 23:46

Creepy

Tactical Espionage Splatterer

Je zult het panel moeten verversen (Refresh() zou hier genoeg voor moeten zijn) en vervolgens moeten aangeven dat de message queue verwerkt moet worden d.m.v. een Application->ProcessMessages(). Dan zou het geheel moeten updaten. Zo niet, vervang dan de Refresh door een Invalidate gevolgd door een Repaint en daarna de ProcessMessages.

Nog een kleine tip: gebruik [code] tags voor je code :)

[ Voor 11% gewijzigd door Creepy op 02-06-2006 10:53 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • MacWolf
  • Registratie: Januari 2004
  • Laatst online: 06-09-2024
In .NET is de mogelijkheid om (de smerige) DoEvents() functie te gebruiken, zodat Windows meteen de interface zal refreshen. Voor een klein tooltje als wat jij aan het maken bent lijkt de functie bruikbaar. Ik weet alleen niet of de functie beschikbaar is onder C++.

EDIT: net even gezocht in Google, maar DoEvents() is niet beschikbaar onder C++, wel kun je de functie min of meer namaken, zie: http://west-wind.com/weblog/posts/771.aspx

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition.


  • __fred__
  • Registratie: November 2001
  • Laatst online: 20-02 11:54
MacWolf schreef op vrijdag 02 juni 2006 @ 11:03:
In .NET is de mogelijkheid om (de smerige) DoEvents() functie te gebruiken, zodat Windows meteen de interface zal refreshen. Voor een klein tooltje als wat jij aan het maken bent lijkt de functie bruikbaar. Ik weet alleen niet of de functie beschikbaar is onder C++.

EDIT: net even gezocht in Google, maar DoEvents() is niet beschikbaar onder C++, wel kun je de functie min of meer namaken, zie: http://west-wind.com/weblog/posts/771.aspx
Is dus niet nodig. Die functie heet in de VCL Application->ProcessMessages().

[ Voor 4% gewijzigd door __fred__ op 02-06-2006 14:52 ]


Verwijderd

Topicstarter
Bedankt voor de hulp! ProcessMessages werkte perfect.

(en ik zal de volgende keer code tags gebruiken, maar kon het niet zo snel terug vinden in het menu bovenin, ben PHPbb gewend, sorry :))