AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi TThread.Synchronize ohne suspend des eigenen Threads.
Thema durchsuchen
Ansicht
Themen-Optionen

TThread.Synchronize ohne suspend des eigenen Threads.

Ein Thema von yankee · begonnen am 10. Mär 2007 · letzter Beitrag vom 20. Mär 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#1

TThread.Synchronize ohne suspend des eigenen Threads.

  Alt 10. Mär 2007, 11:20
Hi @ll,

ich beschäftige mich immernoch mit Threads und habe ein Problem mit Synchronize:
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?
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: TThread.Synchronize ohne suspend des eigenen Threads.

  Alt 10. Mär 2007, 11:22
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#3

Re: TThread.Synchronize ohne suspend des eigenen Threads.

  Alt 10. Mär 2007, 11:25
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...
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: TThread.Synchronize ohne suspend des eigenen Threads.

  Alt 10. Mär 2007, 12:50
Dann brauchst du doch auch kein Synchronize verweden.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#5

Re: TThread.Synchronize ohne suspend des eigenen Threads.

  Alt 10. Mär 2007, 13:42
Hi,

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

  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
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#6

Re: TThread.Synchronize ohne suspend des eigenen Threads.

  Alt 10. Mär 2007, 13:45
Zitat von Luckie:
Dann brauchst du doch auch kein Synchronize verweden.
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...
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

Re: TThread.Synchronize ohne suspend des eigenen Threads.

  Alt 10. Mär 2007, 13:52
Die Funktion wird schon im Thread aufgerufen .. du musst Synchronize verwenden, damit man in deinem Ereigniss sicher auf die VCL zugreifen kann.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#8

Re: TThread.Synchronize ohne suspend des eigenen Threads.

  Alt 10. Mär 2007, 13:53
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
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#9

Re: TThread.Synchronize ohne suspend des eigenen Threads.

  Alt 10. Mär 2007, 14:20
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?
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#10

Re: TThread.Synchronize ohne suspend des eigenen Threads.

  Alt 20. Mär 2007, 21:58
Hi,

wie gesagt, ich machs mit

   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
  GetCurrentThreadID oder so ähnlich

Gruss
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz