AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi TThread: MainThreadsynchronisation ohne Synchronize

TThread: MainThreadsynchronisation ohne Synchronize

Ein Thema von sirius · begonnen am 4. Sep 2008 · letzter Beitrag vom 5. Sep 2008
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#1

TThread: MainThreadsynchronisation ohne Synchronize

  Alt 4. Sep 2008, 21:36
Ich weiß der Andreas hat da auch was. Aber ich will auch mal!

Ich habe eine weitere Möglichkeit zusammengebaut um einen Thread (A) mit einem Thread (B) zu snychronisieren. Dies geht aber nur ausschließlich dann, wenn der Thread A von Thread B aus gestartet wurde. Weitere "Quersynchronisationen" sind nicht möglich. Gedacht ist es um einfach einen speziellen Thread mit dem Mainthread zu synchronisieren. Dabei wurde dieser spezielle Thread auch vom MainThread gestartet. (Ich hoffe soweit ist alles klar)

In der Unit im Anhang liegt die Klasse TThreadEx, welche von TThread abgeleitet ist. Die Anwendung erfolgt über die beiden Methoden StopMainThread und ContinueMainThread:
Delphi-Quellcode:
//alles wie gehabt bei TThread:
type TmyThread=class(TThreadEx)
       protected
         procedure Execute; override;
       ...
     end;
  
...

procedure TmyThread.execute;
begin
...
    
    stopmainthread; //Hier wird der MainThread angehalten und man kann auf Variablen etc. des Mainthreads zugreifen
    try
      form1.memo1.lines.add('Hallo MainThread');
    finally
      continuemainthread; //und jetzt darf der MainThread auch wieder weitermachen
    end;
...

end;
Was sind die Vorteile gegenüber synchronize:
  1. man braucht nicht diesen umständlichen Aufruf von Synchronize, bei dem keine Variablenübergabe möglich ist
  2. diese Variante funktioniert auch in einer DLL (synchronize nicht)

Es war einfach eine Idee von mir, die ich mal ausprobieren musste. Bei meinen Versuchen klappt es ohne Probleme.


Edit 1+2: neue Version, jetzt würde der Mainthread auch bei einem plötzlichen Ende (Exception, Error) des SubThreads weiterlaufen
Angehängte Dateien
Dateityp: pas uthreadex_480.pas (3,6 KB, 57x aufgerufen)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: TThread: MainThreadsynchronisation ohne Synchronize

  Alt 4. Sep 2008, 21:46
Sieht vernünftig aus. Zwei Sachen sollte man allerdings noch erwähnen:
1. Es werden Fenster erzeugt (was per se natürlich kein Nachteil ist, man sollte es nur erwähnen - wenn man den Desktop wechseln will, ist das z.B. denkbar ungünstig) - daher wird im Elternthread auch eine Nachrichtenschleife gebraucht.
2. Im Gegensatz zu Synchronize wird nicht in den Elternthread gewechselt, es wird lediglich der Elternthread gestoppt. Wenn man daher z.B. Fenster erzeugt, gehören sie dem Kindthread.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

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

Re: TThread: MainThreadsynchronisation ohne Synchronize

  Alt 4. Sep 2008, 21:55
Das ist aber nicht ungefährlich, was du da machst. Thread A startet Thread B. Thread B hlät Thread A in einer CriticalSection an, denn Thread B weiß ja nicht, was Thread A gerade macht. Wenn jetzt andere darauf warten das Thread A die CritialSection verlässt, kann das zu Performanceeinbußen führen. Aber richtig schlimm wird es, wenn Thread B abstürzt und Thread A nicht mehr startet. Dann hängen alle Threads, die auf das Freigeben der CriticalSection warten.

Deswegen sollte man es vermeiden einen Thread von aussen anzuhalten. Ein Thread sollte nur sich selber anhalten oder beenden. Meist löst man dass so, dass man ein Flag setzt, welches vom Thread regelmäßig abgefragt wird.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: TThread: MainThreadsynchronisation ohne Synchronize

  Alt 4. Sep 2008, 21:59
Da hat Sirius schon mitgedacht. Es funktioniert ja gerade nicht über ein einfaches SuspendThread, sondern es wird eine Nachricht verschickt. Der Thread kann somit nur in Aufrufen von GetMessage oder PeekMessage angehalten werden.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: TThread: MainThreadsynchronisation ohne Synchronize

  Alt 5. Sep 2008, 09:02
Danke für die Kommentare.

Apollonius:
zu 1: Jep, aber die VCL erzeugt auch ständig neue Fenster (z.B. TTimer), auf diesem Marktplatz bin ich nicht neu. Das Problem mit den Desktops habe ich nicht verstanden. Habe auch noch nie mit mehreren Desktops gearbeitet. Gibt es dar Probleme, und welche?
zu 2: Das sollte man aber auch erwarten wenn man den Code (der Fenstererzeugung) innerhalb der Execute-Methode schreibt. Aber ich sehe ein, dass jemand vielleicht eine Instanz einer neuen VCL-Komponente erstellen will. Das geht so nicht. Bei Threadsynchronisation muss man eben immer aufpassen. Das kann ich durch das klein bisschen Code nicht abnehmen.
btw: Kindthread ist eine schöne Bezeichnung. Ich habe bereits nach so etwas gesucht.

Luckie:
Ich arbeite doch gar nicht mit Critical Sections. Ok, ich nehme Events und das hat alles miteinander zu tun.
Die Idee ist, dass bei StopMainThread der MainThread durch ein Ereignis in eine Methode "gelockt" wird, in der eine Art "Schleife" ohne Application.ProcessMessages ist. Diese "Schleife" (nicht ganz Schleife ist ja nur eine Wait-Function der WinAPI) wird durch das warten auf ein Event (welches durch StopMAinThread gesetzt wird) realisiert.
Nebenbei ist da tatsächlich noch eine Schleife drumrum wegen den synchronen Messages (ob das wirklich notwenig ist, weiß ich nicht).
Die Sache mit dem Thread von außen anhalten, musst du noch mal spezifizieren. Das habe ich nicht verstanden.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

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

Re: TThread: MainThreadsynchronisation ohne Synchronize

  Alt 5. Sep 2008, 09:59
Was ist dir genau unklar in meinem Posting?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: TThread: MainThreadsynchronisation ohne Synchronize

  Alt 5. Sep 2008, 10:16
Der Zusammenhang von deinem Post mit meinem Code leuchtet mir auf Anhieb nicht ein. Aber ich arbeite an mir

Ich sehe grad noch eine Verbesserung darin, dass ich bei msgWaitForMultipleObjects auch noch den Thread (B) mit angeben sollte, falls dieser abstürzt. Aber man sollte natürlich immer ein try-finally um das Anhalten des Threads basteln. Falls du das meinst, Luckie.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

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

Re: TThread: MainThreadsynchronisation ohne Synchronize

  Alt 5. Sep 2008, 10:25
Nun, dein Beispielcode im ersten Posting vermittelte für mich den Eindruck, als wenn du einen Thread von aussen anhalten würdest. Daraufhin hab eich versucht darzustellen, warum man dies nicht tun sollte und wie man es statt dessen besser macht.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: TThread: MainThreadsynchronisation ohne Synchronize

  Alt 5. Sep 2008, 18:00
Naja, den Mainthread anhalten geht ja nicht (oder). Den kann man nur pausieren (wait for some objects) lassen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: TThread: MainThreadsynchronisation ohne Synchronize

  Alt 5. Sep 2008, 18:45
Bezüglich Desktops: Wenn du mit SetThreadDesktop den Desktop eines Threads ändern will (z.B. um auf im Fenster anzuzeigen) darf dieser auf dem alten Desktop keine Fenster haben.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 18:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf