Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TThread.Synchronize ohne suspend des eigenen Threads. (https://www.delphipraxis.net/88109-tthread-synchronize-ohne-suspend-des-eigenen-threads.html)

yankee 10. Mär 2007 10:20


TThread.Synchronize ohne suspend des eigenen Threads.
 
Hi @ll,

ich beschäftige mich immernoch mit Threads und habe ein Problem mit Synchronize:
Zitat:

Zitat von Die Delphihilfe
Execution of the thread current is suspended while Method executes in the main thread.

Ich will eine Methode zwar im Hauptthread aufrufen, aber der aktuelle Thread soll weiterlaufen. Wie kann ich das machen?

Luckie 10. Mär 2007 10:22

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.

yankee 10. Mär 2007 10:25

Re: TThread.Synchronize ohne suspend des eigenen Threads.
 
Zitat:

Zitat von Luckie
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.

mhh... ich mache aber garnichts mit vcl in dem Hauptthread...
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...

Luckie 10. Mär 2007 11:50

Re: TThread.Synchronize ohne suspend des eigenen Threads.
 
Dann brauchst du doch auch kein Synchronize verweden. :gruebel:

thkerkmann 10. Mär 2007 12:42

Re: TThread.Synchronize ohne suspend des eigenen Threads.
 
Hi,

schicke dem Hauptthread doch einfach eine Windows Botschaft. z.B. mit

Delphi-Quellcode:
  PostMessage(Application.Mainform.Handle, WM_MEINEBOTSCHAFT, 0, 0);
Der kann dann darauf reagieren und die entsprechende Methode aufrufen.
Du könntest die Botschaftsparameter WParam und LParam noch dazu nutzen,
zwei integer Werte zu übergeben.

Gruss

yankee 10. Mär 2007 12:45

Re: TThread.Synchronize ohne suspend des eigenen Threads.
 
Zitat:

Zitat von Luckie
Dann brauchst du doch auch kein Synchronize verweden. :gruebel:

Aber wenn ich kein Synchronize verwende, wird doch die Funktion, die ich aufrufe nicht im Hauptthread aufegrufen, oder sehe ich das falsch?
Also mal ein ganz simples theoretisches Beispiel:
Delphi-Quellcode:
TmyThread =class(TThread)
public
  OnSomeEvent: procedure of object;
  procedure Execute; override;
end;

procedure TmyThread.Execute();
begin
  while not Terminated do
  begin
    OnSomeEvent();
  end;
end;
Jetzt will ich, dass OnSomeEvent im Hauptthread ausgeführt wird, aber die Execute-Procedure nicht warted, bis OnSomeEvent fertig ist, sondern sofort weitermacht.
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...

Zacherl 10. Mär 2007 12:52

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.

thkerkmann 10. Mär 2007 12:53

Re: TThread.Synchronize ohne suspend des eigenen Threads.
 
Zitat:


EDIT: @thkerkmann: Das wäre wahrscheinlich eine Möglichjkiet, aber klingt für mich nicht nach gutem Programierstil...
Das ist schon guter Programmierstil. In Windows API ausgedrückt gibt es dafür die Funktion

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 :-)

yankee 10. Mär 2007 13:20

Re: TThread.Synchronize ohne suspend des eigenen Threads.
 
Zitat:

Zitat von thkerkmann
SendThreadMessage (...) / PostThreadMessage (...)

Eine andere Möglichkeit etwas Anzustossen hast du nicht - du sagst ja es soll parallel dazu weiterlaufen...

Nagut... Dann nur noch 2 Fragen dazu:
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?

thkerkmann 20. Mär 2007 20:58

Re: TThread.Synchronize ohne suspend des eigenen Threads.
 
Hi,

wie gesagt, ich machs mit

Delphi-Quellcode:
   PostMessage(Application.Mainform.Handle, WM_MEINEMESSAGE, 0, 0);
im Mainform deklarierst Du im Protected Abschnitt:

Delphi-Quellcode:
  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;
Synchronize benutzt übrigens auch das Windows Message Handling zur Synchronisation.

Und die ThreadID vom Mainthread sollte dieser sich vorher holen und an den anderen Thread übergeben.
Dazu gibt es
Delphi-Quellcode:
  GetCurrentThreadID
oder so ähnlich :oops:

Gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 Uhr.
Seite 1 von 2  1 2      

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