Thread Problem - Repaint tut nicht



  • Hallo,

    ich habe gerade begonnen mich mit threads zu beschäftigen. Ich habe ein ganz einfaches Beispielprogramm gemacht auf dem 4 Edit Felder sind und im Hindergrund wird immer die Überschrift der Form hochgezählt. Dann habe ich noch ein paar Knöpfe um den Thread zu starten, beenden, ... Eigenlich fand ich es einfach zu erstellen.
    Doch als ich zufällig mein Programm laufen lies und kurz zwischen zwei Anwendungen hin und her Sprang bemerkte ich, dass der Rahmen der Form nicht mehr neu gezeichnet wird. Also die Blaue Leiste oben hatte ein ganz andere Farbe und das Deaktivierenkreuz wurde gar nicht mehr angezeigt. (kein Refresh mehr)

    Mein Thread-Code:

    __fastcall test::test(bool CreateSuspended)
            : TThread(CreateSuspended)
    {
    
    }
    //---------------------------------------------------------------------------
    void __fastcall test::Execute()
    {
           for(int ix = 0;;ix++)
           {
             Form1->Caption = ix;
             if(Terminated)
                 return;
             Application->ProcessMessages();
           }
    }
    

    und hier der Code der Form:

    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
       test1 = new test(true);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       delete test1;   //Später in den destruktor
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
       test1->Resume();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
       test1->Suspend();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
       test1->Terminate();
    }
    
    //Code und andere Methoden teilweise entfernt
    

    kann mir jemand sagen wie man das Refresh-Repaint Problem am besten behebt und wo?



  • //   Important: Methods and properties of objects in VCL can only be
    //   used in a method called using Synchronize, for example:
    //
    //      Synchronize(UpdateCaption);
    //
    //   where UpdateCaption could look like:
    //
    //      void __fastcall test::UpdateCaption()
    //      {
    //        Form1->Caption = "Updated in a thread";
    //      }
    //---------------------------------------------------------------------------
    

    Kommt dir das nicht irgendwie bekannt vor? Man sollte hald schon lesen was der BCB so generiert...

    -junix



  • Klar kommt mir das bekannt vor (steht ja fett da). Aber ich kann damit nichts anfangen.

    Soll das heißen wenn ich es in eine Methode auslagere dann tuts ?
    Was macht denn das für einen Unterschied in welcher Methode es steht?

    Was ist "Synchronize"



  • solo schrieb:

    Was ist "Synchronize"

    Die BCB Hilfe informiert.

    -junix



  • Super Antwort. Wäre ich nie selber drauf gekommen. Bräuchte man in der Schule keinen Lehrer mehr, kann ja alles aus dem Buch lernen.
    Wäre ja einfach wenn man das immer verstehen würde, sonst bräucht man kein Forum. Zudem ist mein BCB auf Deutsch wieso sind dann Teile auf Englisch (u. a. Hilfe).

    Aber egal, zurück zu meinem Problem:
    Also ich habe es so verstanden wenn ich Caption_setzen in einer Methode auslagere und mit Synchronize aufrufe bestehe dieses Problem nicht.

    Aber warum ?

    Synchronize wartet, bis der Haupt-Thread in die Botschaftsschleife eintritt, und führt dann die übergebene Methode aus.

    das steht in der Hilfe.
    was ist gemeint mit Botschaftsschleife,
    und, wie hängt das mit Repaint zusammen ?



  • Na also! Da haben wir ja endlich konkrete Fragen. Wieso muss man typen wie dich immer erst aus der Reserve locken, bis sie endlich rausrücken können, wo genau das Problem steckt?

    Die Botschaftsschleife bzw. die Nachrichtenschleife hängt mit dem Repaint insofern zusammen, dass der Repaint als WindowsMessage bzw. eben Nachricht daher kommt. Wenn du dich genauer dafür interessierst, was die Nachrichtenschleife ist, so kann dich bestimmt das WinAPI Forum informieren oder im netz irgendwo ne Site.

    -junix



  • junix schrieb:

    so kann dich bestimmt das WinAPI Forum informieren oder im netz irgendwo ne Site.

    Und das WinAPI Forum schiebt ihn wieder hierher, da er den BCB benutzt! 😉

    @solo
    Du verwendest doch Application->ProcessMessage() im Thread,
    A. braucht das nicht darein, da der Haupt-Thread (Dein Programm) das behandelt.
    B. weißt du was Application->ProcessMessage() bedeutet?

    Mal doof erklärt:
    stell dir ein Kreis mit 10 Personen(Programme) vor, in der Mitte ist Bill Gehtes(!)
    Wenn alle drauflos Reden würden, kann der Billy nichts mehr Verstehen, daher
    sagt er der Reihe nach, jedem das er was Sagen (machen) darf (Multitaskting Simulation)
    Und wenn er sagt das Du an der Reihe bist, darfst du auch was Sagen
    (Message) und Dein Kind (Thread) auf dem Rücken auch, wenn dein
    Kind aber drauf los quasselt und immer ruft: "Billy male Papas TEdit neu",
    höhrt er es nicht, und wenn dein Nachbar nen Schritt nach vorne macht (Fenster
    Aktiv einer anderen Anwendung), dann kann dein Kind schreien wie es will.
    Der Babysitter (Sychronize) hift dir das dein Kind die Schnuller im Mund hat
    wenn du nicht drann bist, und nimmt ihn raus wenn Billy sagt jetzt bist du drann.
    Damit du nicht stumm bleibst in diesem Kreis, weil eine Schleife (while/for)
    dich daran hindert, giebt es die Funktion Application->ProcessMessage() die
    dafür sorgt das du denn Mund aufmachen kannst, aber das gild für dich und
    nicht für dein Kind, dein Kind hat den Babysitter.

    Ich weiß, ist nicht gerade eine Profi Erklärung, aber als ich das gerade laut
    meiner kleinen Tochter vorgelesen habe, meint sie jetzt sie darf nur Krach
    machen wenn Billy mir sagt ich darf was sagen 😉
    Andersherum sagt sie, halt die Klappe, Billy hat es noch nicht erlaubt 😞

    Ist zwar nicht sehr Lustig, aber ich hoffe zum Schmunzeln reichts, und ich
    denke es wurde in Etwa der Ablauf erklärt.

    gruß Micha


Anmelden zum Antworten