![]() |
TThread.Synchronize ohne suspend des eigenen Threads.
Hi @ll,
ich beschäftige mich immernoch mit Threads und habe ein Problem mit Synchronize: Zitat:
|
Re: TThread.Synchronize ohne suspend des eigenen Threads.
Mit der TThread-Klasse gar nicht, da die VCL nicht threadafe ist, muss der Thread unterbrochen werden, wenn er eine Methoe im Hauptthread aufrufen soll.
|
Re: TThread.Synchronize ohne suspend des eigenen Threads.
Zitat:
Und selbst wenn... Ich trete doch nur ein Event im Hauptthread los und mache dann mit meiner Aufgabe weiter... Da würden doch garnicht 2 Threads gleichzeitig auf irgendwas zugreifen... |
Re: TThread.Synchronize ohne suspend des eigenen Threads.
Dann brauchst du doch auch kein Synchronize verweden. :gruebel:
|
Re: TThread.Synchronize ohne suspend des eigenen Threads.
Hi,
schicke dem Hauptthread doch einfach eine Windows Botschaft. z.B. mit
Delphi-Quellcode:
Der kann dann darauf reagieren und die entsprechende Methode aufrufen.
PostMessage(Application.Mainform.Handle, WM_MEINEBOTSCHAFT, 0, 0);
Du könntest die Botschaftsparameter WParam und LParam noch dazu nutzen, zwei integer Werte zu übergeben. Gruss |
Re: TThread.Synchronize ohne suspend des eigenen Threads.
Zitat:
Also mal ein ganz simples theoretisches Beispiel:
Delphi-Quellcode:
Jetzt will ich, dass OnSomeEvent im Hauptthread ausgeführt wird, aber die Execute-Procedure nicht warted, bis OnSomeEvent fertig ist, sondern sofort weitermacht.
TmyThread =class(TThread)
public OnSomeEvent: procedure of object; procedure Execute; override; end; procedure TmyThread.Execute(); begin while not Terminated do begin OnSomeEvent(); end; end; Wenn ich nicht synchronize verwende, wird OnSomeEvent doch von meinem Thread aufgerufen statt vom Hauptthread. Aber wenn ich synchronize verwende, dann wird OnSomeEvent zwar im Hauptthread ausgeführt, aber mein Nebenthread stoppt trotzdem oder verstehe ich da was falsch? EDIT: @thkerkmann: Das wäre wahrscheinlich eine Möglichjkiet, aber klingt für mich nicht nach gutem Programierstil... |
Re: TThread.Synchronize ohne suspend des eigenen Threads.
Die Funktion wird schon im Thread aufgerufen .. du musst Synchronize verwenden, damit man in deinem Ereigniss sicher auf die VCL zugreifen kann.
|
Re: TThread.Synchronize ohne suspend des eigenen Threads.
Zitat:
SendThreadMessage (...) / PostThreadMessage (...) Eine andere Möglichkeit etwas Anzustossen hast du nicht - du sagst ja es soll parallel dazu weiterlaufen... Gruss Thomas P.S. Ich arbeite an einem grossen Softwaresystem zur Anlagensteuerung, da gibt es ca. 15-20 verschieden Programme die mit Thread arbeiten, und da mach ich das auch so. Das läuft prima - ist einsichtig - hat bisher jeder verstanden - und threadsave :-) |
Re: TThread.Synchronize ohne suspend des eigenen Threads.
Zitat:
1. Wie komme ich an die Threadid vom Mainthread? 2. *duck* Wie komme ich an die Message in meinem Mainthread? EDIT: Und wie kommt es, dass snychronize das auch ohne Messages schafft, nur ungünstigerweise meinen Thread pausiert? |
Re: TThread.Synchronize ohne suspend des eigenen Threads.
Hi,
wie gesagt, ich machs mit
Delphi-Quellcode:
im Mainform deklarierst Du im Protected Abschnitt:
PostMessage(Application.Mainform.Handle, WM_MEINEMESSAGE, 0, 0);
Delphi-Quellcode:
Synchronize benutzt übrigens auch das Windows Message Handling zur Synchronisation.
procedure WMMEineMessage(var Msg:tMessage); message WM_MEINEMESSAGE;
... procedure WMMeineMessage(var Msg:tMessage); begin // und hier kannst Du dann tun wozu dich der Thread auffordert. end; Und die ThreadID vom Mainthread sollte dieser sich vorher holen und an den anderen Thread übergeben. Dazu gibt es
Delphi-Quellcode:
oder so ähnlich :oops:
GetCurrentThreadID
Gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz