Schleife blockiert VCL Applikation


#1
Hallo Zusammen,

ich möchte eine VCL Anwendung Programmieren bei der Ich mit dem einen Button eine Schleife z.B. do...... while starte und diese dann mit einem Zweiten Button die Schleife unterbrechen kann. In der Schleife werden externe Daten von einen Gerät eingelesen und kontinuierlich in der Anwendung dargestellt. Klappt auch so weit. Jetzt wurde ich gerne mit den klicken auf den Zweiten Button die schleife abbrechen. Jetzt kömmt mein Problem die VCL Anwendung ist durch die Schleife blockiert.

Ich denke mit einen Thread sollte es klappen, hab ich aber noch nie programmiert

Was wären eure Lösungen für mein Problem

Danke

Daniel1974
 
#2
Meine klassische Lösung geht in die Richtung:
Code:
bool bAborted = false;

...

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    for(int i = 0; i < 100; i++)
    {
      // Mach irgendwas, z.B.
      Application->ProcessMessages(); // ist wichtig, damit der Klick auf den anderen
                                      // Button registriert werden kann.
      if(bAborted)
        break;
    }
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  bAborted = true;
}
Das Problem ist, während die for-Schleife läuft, kommt das Programm normalereise gar nicht dazu, den Klick auf den 2. Button zu verarbeiten. Genau das erzwingt aber Application->ProcessMessages(). Damit werden alle angestauten Windowsnachrichten (auch der Klick auf den 2. Button) abgearbeitet und der Klick kann wieder registriert werden.