Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Mehrere Threads gleichzeitig... (https://www.delphipraxis.net/62151-mehrere-threads-gleichzeitig.html)

glkgereon 31. Jan 2006 15:34


Mehrere Threads gleichzeitig...
 
hi,

ich möchte mehrere Threads eines Typs gleichzeitig ausführen.

dazu habe ich mir überlegt:

ich schreibe mir ganz normal meinen Thread als ableitung von TThread
dann mache ich mir nen array davon und erstelle in ner schleife alle und führe sie aus.

das ganze sieht dann so aus:
Delphi-Quellcode:
    Thr: array [1..Cnt] of TMyThread;

procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
begin
  for i:=1 to Cnt do
    begin
    Thr[i]:=TMyThread.Create(True);
    //Noch paar Property setzen
    Thr[i].Execute;
    ShowMessage('Thread '+IntToStr(i)+' Executed');
    end;
end;
interessanterweise wird aber nur ein Thread erstellt und ausgeführt...(Cnt ist natürlich >1 ;) )

Anhaltspunkte:
- ShowMessage erscheint nicht
- Ausgabe (via Synchronize) kommt nur vom ersten Thread
- Access Violation beim freigeben ab dem zweiten Thread...

warum macht der nicht einfach in der schleife weiter?

ste_ett 31. Jan 2006 15:41

Re: Mehrere Threads gleichzeitig...
 
Wenn du als Parameter bei create True übergibst, musst du die Threads per Name.Resume; wieder starten. :)

glkgereon 31. Jan 2006 15:42

Re: Mehrere Threads gleichzeitig...
 
Zitat:

Zitat von ste_ett
Wenn du als Parameter bei create True übergibst, musst du die Threads per Name.Resume; wieder starten. :)

könnte ich auch einfach false übergeben?

ste_ett 31. Jan 2006 15:46

Re: Mehrere Threads gleichzeitig...
 
Natürlich. :)

Allerdings rennen die Thread dann sofort los.
Wenn du erst noch Werte innerhalb deiner TMyThread-Instanz setzen willst/musst, musst du das im Konstruktor machen, oder bei dem True bleiben und dann mit .Resume; (kein Execute mehr) den Thread wieder starten.

TGR 31. Jan 2006 15:49

Re: Mehrere Threads gleichzeitig...
 
Statt
Delphi-Quellcode:
Thr[i].Execute;
musst Du
Delphi-Quellcode:
Thr[i].Resume;
schreiben, da sonst keine Properties mehr gesetzt werden können (bzw. es mach dann keinen Sinn)

Thomas

glkgereon 31. Jan 2006 15:52

Re: Mehrere Threads gleichzeitig...
 
ok, also das geht jetzt...

aber direkt das nächste problem :)

wie mach ich die wieder aus?

Delphi-Quellcode:
var i:Integer;
begin
  for i:=1 to Cnt do
    begin
    Thr[i].Suspend;
    Thr[i].Free;
    end;
end;
er bleibt nun beim Thr[i].Free einfach hängen...
und die Threads laufen weiter :(

TGR 31. Jan 2006 16:05

Re: Mehrere Threads gleichzeitig...
 
Delphi-Quellcode:
var i:Integer;
begin
  for i:=1 to Cnt do
  begin
    Thr[i].Terminate;
    Thr[i].Priority=tpHigher;
    Sleep(0);
    Thr[i]:=nil;
  end;
end;
Um auf die Beendigung zu warten kannst Du das Ereignis OnTerminate auswerten.

Thomas

glkgereon 31. Jan 2006 16:16

Re: Mehrere Threads gleichzeitig...
 
Zitat:

Zitat von TGR
Delphi-Quellcode:
var i:Integer;
begin
  for i:=1 to Cnt do
  begin
    Thr[i].Terminate;
    Thr[i].Priority=tpHigher;
    Sleep(0);
    Thr[i]:=nil;
  end;
end;
Um auf die Beendigung zu warten kannst Du das Ereignis OnTerminate auswerten.

Thomas

Also im OnTerminate setze ich dann eine Variable auf True, woraufhin dann die Hauptschleife des Threads aufhören sollte...

aber sie tut es nicht.
ich hab so das gefühl das OnTerminate kommt nicht an :(

Robert Marquardt 31. Jan 2006 16:21

Re: Mehrere Threads gleichzeitig...
 
Das Suspend ist falsch. Bamit haelst du den Thread ja an und er kann sich garnicht beenden.

jfheins 31. Jan 2006 16:22

Re: Mehrere Threads gleichzeitig...
 
Oder du stellst FreeOnTerminate auf True und dann zum ausmachen einfach Thread.Terminate;
(im thread natürlich ein while not Terminated do ... ;) )


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:34 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 by Thomas Breitkreuz