Multi-Thread Programmierung



  • Danke für deine Antwort,

    wenn ich das so mache, dann "friert" meine Anwendung ein, solange ich mich in der MyExecute von TmyThread befinde.

    Woran kann das liegen?

    LG
    Todd



  • C++Builder-Dokumentation schrieb:

    Die Methode Synchronize führt innerhalb des VCL-Haupt-Threads einen Methodenaufruf aus.



  • Hallo,

    Die Methode Synchronize führt innerhalb des VCL-Haupt-Threads einen Methodenaufruf aus.

    Das sagt mir leider nichts. Wie kann ich denn verhindern, dass mir das ganze einfriert?
    Brauche ich die Synchronize Methode überhaupt?

    Danke
    Todd



  • Todd schrieb:

    Wie kann ich denn verhindern, dass mir das ganze einfriert?

    Nicht Synchronize() benutzen. Was du dort als Argument übergibst, wird im Hauptthread, also demjenigen, der für die Benutzerinteraktion zuständig ist, ausgeführt, und wenn der mit dem Ausführen deiner Funktion beschäftigt ist, kann er eben nicht mit dem Benutzer interagieren 😉

    Synchronize() benutzt man i.d.R. nur, um auf nicht threadsichere Funktionen wie die der visuellen Komponenten der VCL zuzugreifen, also z.B., wenn der Thread nach dem Beenden seiner Aufgabe das Ergebnis in ein Memo eintragen will.



  • Okay,

    danke. Jetzt verstehe ich es.

    Wie kann ich aber verhindern, dass innerhalb des zweiten Thread's etwas schief geht und er aus diesem nicht mehr heraus kommt.

    Wenn zum Beispiel innerhalb der .dll ein Berechnungsfehler vorliegt und nicht mehr aus dieser herausfindet.

    Gibt es eine Rücksicherung für solche Fälle?

    LG
    Todd



  • Du kannst dem Benutzer die Möglichkeit geben, den Thread zu terminieren, falls ihm die Wartezeit zu lange wird, z.B. mittels TerminateThread oder KillThrd.



  • Danke für deine Antwort.

    Kann man denn überprüfen, ob ein Thread noch läuft?
    Gibt es hierfür vielleicht schon eine eingebaute Funktion?

    LG
    Todd



  • da du das selfdestruct gewählt hast, wird das schwierig, FreeOnTerminate bewirkt das dein Zeiger ins nichts verweist ... wenn du aber darauf verzichtest, kannst du z.B. im c-tor des thread eine variable bool finished mit false initialisieren und die kurz vorm verlassen der execute auf true setzen, in deinem programm kannst du dann einfach diese variable abrufen und dann den thread sauber "von hand" deleten

    ansonsten kannst du ja den d-tor des thread überschreiben und ein signal an deine hauptklasse liefern (dann gehts auch mit freeonterminate = true)

    ich spinn hier mal was zusammen, du machst n neues Form auf (showmodal) mit text "Aufruf wird bearbeitet", startest in dem form den thread und übergibst ihm einen pointer auf das form, wenn die execute beendet setzt du im d-tor des thread einfach das modalresult des Form auf OK. dann könntest auch nen abbruch button unterbringen



  • Ich würde dem Thread im Konstruktor eine Callback-Funktion mit übergeben, welche dem Hauptthread das beenden signalisiert. Aufgerufen wird die dann im Destruktor. Dabei muß der eigentliche Thread auch nichts genaues vom Hauptthread wissen.
    Bei mir hat eine deratige Funktion immer folgende Signatur

    typedef void CloseCallback(unsigned int, TForm*);
    

    DDie Funktion kann man dann im Hauptthread global oder als statische Memberfunktion der Form definieren.
    Auf die Art braucht man kein Include des Header der Hauptform im Thread.



  • Danke für deine Antwort.

    Werde dem Hinweis nachgehen und mich evtl. zur gegebenen Zeit wieder melden.

    Liebe Grüße
    Todd


Anmelden zum Antworten