Funktionsaufruf stoppt Thread!?



  • Hallo,
    ich experimentiere gerade etwas mit Threads (Boost/Windows). Was mir aufgefallen ist, wenn ich eine Funktion aufrufe (btnClick einer Form), so bleib mein Thread stehen. Ist das normal? Hätte ich jetzt anders erwartet...(zum Test schreibt mein Thread einen Zähler in die Caption der Form, dieser bleibt beim Button Click stehen und zählt auch erst weiter wenn die BtnClick Routine zurückkommt. Es ist nciht so das nur die Anzeige blockiert ist.

    Folgende Funktionen habe ich:

    void TForm1::Thread()
    {
       int i = 0;
       do{
          Sleep(100);
          Caption = i++;
       } while(true);
    }
    
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
       for(int i = 0 ; i < 100000000; i++)
       {  // Delay (ohne sleep gebaut)
       }
    }
    

    Thread wird so gestartet:

    boost::thread t(&this->Thread);
    

    Gruss

    Jörn



  • California schrieb:

    zum Test schreibt mein Thread einen Zähler in die Caption der Form

    Das dürfte schon der Grund sein, VCL-Controls sind nicht threadsicher. Das Zuweisen der Caption dürfte dazu führen, dass sich das Formular neu zeichnen will, das tut es im Hauptthread, wenn der beschäftigt ist, geht natürlich nichts.

    Um aus dem Thread auf die GUI zuzugreifen, musst du entweder TThread und Synchronize() verwenden,
    http://docwiki.embarcadero.com/Libraries/XE3/de/System.Classes.TThread.Synchronize
    vom Thread aus Windows Messages an das Formular senden,
    oder vom Thread aus in eine threadsichere Datenstruktur schreiben und die Daten dann (z.B. mit einem Timer) vom GUI Thread aus holen.


Log in to reply