Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Schlafende Threads (https://www.delphipraxis.net/168253-schlafende-threads.html)

sirius 14. Mai 2012 08:21

AW: Schlafende Threads
 
Hi brechi,

Das Terminate in den Destructor zu setzen gefällt mir auch.

Aber den geerebten Constructor kannst du auch am Anfang aufrufen. Das ist ein Märchen, dass bei TThread das inherited am Ende des Constructors sitzen muss. Der Thread wird eh erst in der überschriebenen Methode "AfterConstruction" gestartet (sofern createsuspended=false), also erst wenn der komplette Code des Constructors abgearbeitet ist.

shmia 14. Mai 2012 16:19

AW: Schlafende Threads
 
Zitat:

Zitat von sirius (Beitrag 1166388)
Der Thread wird eh erst in der überschriebenen Methode "AfterConstruction" gestartet (sofern createsuspended=false), also erst wenn der komplette Code des Constructors abgearbeitet ist.

Für Delphi 5 scheint das aber nicht zu stimmen:
Delphi-Quellcode:
constructor TThread.Create(CreateSuspended: Boolean);
var
  Flags: DWORD;
begin
  inherited Create;
  AddThread;
  FSuspended := CreateSuspended;
  Flags := 0;
  if CreateSuspended then Flags := CREATE_SUSPENDED;
  FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), Flags, FThreadID); // <=====
end;
Also muss man wohl zuerst das Event erzeugen (oder man erzeugt es erst in Execute() und handelt sich dafür andere Probleme ein).

Zitat:

Zitat von brechi (Beitrag 1166173)
Irgendwie gefällt mir das auch alles nicht, wieso z.b. das ResetEvent vor DoWork?

Weil ja während DoWork noch abgearbeitet wird von Aussen ein neuer "WakeUp-Befehl" eintreffen könnte.
So richtig nützlich wird das Ganze erst, wenn man noch ein threadsicheren Fifo hinzunimmt, damit DoWork jedes Mal die richtigen Inputdaten bekommt.

Aber es scheint ja auch so schon schwierig genug einen TThread mit einem TSimpleEvent zu verheiraten.

himitsu 14. Mai 2012 16:35

AW: Schlafende Threads
 
Jetzt weiß ich auch wieder, warum ich nur noch die Kompatibilität bis D7 und bei aktuellen Projekten nur noch bis maximal D2006 gewährleiste

sirius 14. Mai 2012 17:00

AW: Schlafende Threads
 
Zitat:

Zitat von shmia (Beitrag 1166487)
Für Delphi 5 scheint das aber nicht zu stimmen:

Daher kommt das immer. Ok in Delphi 7 wird im Constructor BeginThread immer CREATE_SUSPENDED aufgerufen und dann gibt es AfterConstruction:
Delphi-Quellcode:
procedure TThread.AfterConstruction;
begin
  if not FCreateSuspended then
    Resume;
end;

shmia 15. Mai 2012 16:43

AW: Schlafende Threads
 
Ich habe den Konstruktor jetzt so geändert:
Delphi-Quellcode:
constructor TSleepingThread.Create(CreateSuspended: Boolean);
begin
   inherited Create(True);
   FEvent := TSimpleEvent.Create;
   if not CreateSuspended then
      Resume;
end;
Ausserdem gibt es noch einen 2. Thread in dem Demo um es einfache Datenübergabe zu zeigen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:46 Uhr.
Seite 2 von 2     12   

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