Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi WaitForSingleObject und Threads (https://www.delphipraxis.net/46619-waitforsingleobject-und-threads.html)

endeffects 28. Mai 2005 12:08


WaitForSingleObject und Threads
 
Hallo,

ich erzeuge in einem Thread folgende while schleife:

Delphi-Quellcode:
      while not terminated do
      begin
        if output= true then
          break;
      end;
da der rückgabewert der methode output von äußeren faktoren
abhängt ist es möglch das die while-schleife zu einer endlosschleife mutiert,
darum wollte ich mit hilfe von WaitForSingleObject einen timeout
in die while schleife basteln um diese nach ablauf verlassen zu können.

könnte mir vielleicht jemand kurz erklären wie ich das am besten bewerkstellige?
die geschichte mit dem thandle ist mir nämlich nicht so ganz klar

Dax 28. Mai 2005 12:14

Re: WaitForSingleObject und Threads
 
Verstehe ich das richtig, du willst deinen Thread laufen lassen und wenn er nach einer bestimmten Zeit noch nicht durchgelaufen ist, beenden?

Das machst du am besten in einem separaten Thread:

Delphi-Quellcode:
AndererThread.FreeOnTerminate := False;
WaitForSingleObject(AndererThread.Handle, DeinTimeout);
if not AndererThread.Terminated then
  AndererThread.Terminate;
AndererThread.Free;
Ungetestet, aber so sollte es prinzipiell gehen ;)

endeffects 28. Mai 2005 12:16

Re: WaitForSingleObject und Threads
 
nein ich möchte den thread nicht beenden,
lediglich die while schleife, der thread soll
dann noch weiter arbeiten :)

Dax 28. Mai 2005 12:20

Re: WaitForSingleObject und Threads
 
Dann verpass deinem Thread mit der Schleife eine Property "ShouldBreak" und mach es dann so:
Delphi-Quellcode:
WaitForSingleObject(AndererThread.Handle, DeinTimeout);
AndererThread.ShouldBreak := True;
Deine Thread-Schleife muss dann so aussehen:
Delphi-Quellcode:
while not terminated do
  begin
    if output or ShouldExit then
      break;
    end;
Ich hoff es hilft ;)

endeffects 28. Mai 2005 12:42

Re: WaitForSingleObject und Threads
 
hmm jain *g

also die threads werden im hauptthread in einem array erzeugt,
ich weiß jetzt nicht so genau wie und welches handle ich übergeben soll

//MainForm
Delphi-Quellcode:
    for Loop:= 0 to length(ThreadArray) - 1 do
    begin
      ThreadArray[Loop]:= TMyThreads.Create(true);
      ThreadArray[Loop].FIndex:= Loop;
      ThreadArray[Loop].Priority:= tpIdle;
      ThreadArray[Loop].FreeOnTerminate:= True;
      ThreadArray[Loop].Resume;
    end;
die while schleife läuft zudem noch in einer for schleife,
wenn ich das nun halbwegs richtig verstanden habe müßte das dann
ungefähr so aussehen:

//TMyThreads = class(TThread)
Delphi-Quellcode:
   for i:= 0 to ....
      WaitForSingleObject(???, 30000);
        ???.ShouldExit := True;
      while not terminated do
        if output or ShouldExit then
          break;


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:40 Uhr.

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