Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi [Threads] auf Suspended warten (https://www.delphipraxis.net/29907-%5Bthreads%5D-auf-suspended-warten.html)

sieppl 16. Sep 2004 13:20


[Threads] auf Suspended warten
 
Hallo,

wie kann ich in meine Hauptroutine warten bis ein Thread Suspended ist?
Ich setzte nämlich einen Bool im Thread auf True, dann wird der aktuelle
Arbeitsschritt zu Ende geführt und suspendiert sich danach selbst.
Wenn ich in der Hauptroutine ein
Delphi-Quellcode:
while not Thread.Suspended do
  Sleep(100);
mache, bekommt der thread anscheinend gar keine Rechenzeit mehr.
ALso am besten die Rechenzeit an den Thread abgeben.

Danke!

Sebastian

KrasserChecker 16. Sep 2004 13:38

Re: Thread auf Supended warten
 
Häh? Wo bleibt denn da der witz eines Threads? :gruebel:
Wenn Du im Hauptprogramm darauf wartest, dass der Thread mit etwas fertig ist, dann kannst Du es doch gleich im Hauptthread machen...? :?

sieppl 16. Sep 2004 13:39

Re: Thread auf Supended warten
 
Ich habe es jetzt mit einer Delay-Funktion gelöst. Wo liegt denn der Unterschied zwischen Delay und Sleep? Hier der Link zu einigen Möglichkeiten: Torry's Delphi Pages Delay Functions

sieppl 16. Sep 2004 13:42

Re: Thread auf Supended warten
 
Zitat:

Zitat von KrasserChecker
Häh? Wo bleibt denn da der witz eines Threads? :gruebel:
Wenn Du im Hauptprogramm darauf wartest, dass der Thread mit etwas fertig ist, dann kannst Du es doch gleich im Hauptthread machen...? :?

der Thread erzeugt Thumbnails. Wenn ich nun während der Erzeugung den selben Ordner per Drag und Drop verschieben möchte, sollte ich zusehen, dass der Thread nicht mehr auf die Files zugreift..

Meflin 16. Sep 2004 14:29

Re: Thread auf Supended warten
 
dass dein thread keuine rechenzeit bekommt könnte wohl am sleep liegen. denn das dient ja dazu dass der thread keine rechenzeit bekommt :roll: oder verstehe ich das problem falsch?

sieppl 16. Sep 2004 21:08

Re: [Threads] auf Suspended warten
 
ich denke auch, dass Sleep nicht nur den Hauptthread sondern auch alle anderen Threads lahmlegt. Delay finde ich nicht sehr elegant, funktioniert aber. Gibt es denn keinen richtigen Befehl, der Rechenzeit an Threads abgibt? So etwas wie WaitForSingleObject, aber für das Suspendieren..

asdfg 20. Nov 2005 16:13

Re: [Threads] auf Suspended warten
 
Zitat:

Zitat von sieppl
ich denke auch, dass Sleep nicht nur den Hauptthread sondern auch alle anderen Threads lahmlegt. Delay finde ich nicht sehr elegant, funktioniert aber. Gibt es denn keinen richtigen Befehl, der Rechenzeit an Threads abgibt? So etwas wie WaitForSingleObject, aber für das Suspendieren..

Das könnte vllt. weiterhelfen:
http://www.delphicorner.f9.co.uk/articles/op1.htm

Der_Unwissende 20. Nov 2005 16:20

Re: [Threads] auf Suspended warten
 
Rechenzeit wird mit Application.ProcessMessages freigegeben.

Aber bist du dir sicher, dass du auf ein Suspend warten möchtest? Sollte Suspend nicht durch den Hauptthread gesetzt werden um den Thread zu unterbrechen? Wenn du jedenfalls auf irgendwas wartest gibt es folgende Möglichkeiten

Delphi-Quellcode:
// Wartezeit ms warten und währenddessen Rechenzeit freigeben

var ticks : Int64;
begin
  ticks := GetTickCount;
  while not (GetTickCount - time) >= Wartezeit do
    begin
      Application.ProcessMessages;
    end;
end;

// Warten bis irgendeine Bedingung erfüllt ist
begin
  while not Bedingung do
    begin
      Application.ProcessMessages;
    end;
end

asdfg 20. Nov 2005 16:26

Re: [Threads] auf Suspended warten
 
Zitat:

Zitat von Der_Unwissende
Rechenzeit wird mit Application.ProcessMessages freigegeben.

Aber bist du dir sicher, dass du auf ein Suspend warten möchtest? Sollte Suspend nicht durch den Hauptthread gesetzt werden um den Thread zu unterbrechen? Wenn du jedenfalls auf irgendwas wartest gibt es folgende Möglichkeiten

Delphi-Quellcode:
// Wartezeit ms warten und währenddessen Rechenzeit freigeben

var ticks : Int64;
begin
  ticks := GetTickCount;
  while not (GetTickCount - time) >= Wartezeit do
    begin
      Application.ProcessMessages;
    end;
end;

// Warten bis irgendeine Bedingung erfüllt ist
begin
  while not Bedingung do
    begin
      Application.ProcessMessages;
    end;
end

http://www.delphicorner.f9.co.uk/articles/op1.htm
Zitat:

it's totally inefficient. While Application.ProcessMessages allows a program to continue to receive and process messages it receives, it still eats up CPU time because all it's doing is yielding temporarily, then going back to its original state, meaning it constantly activates and deactives.
http://www.ibrtses.com/delphi/threads.html
Zitat:

Beside waiting for a TEvent, there are WaitForSingleObject and WaitforMultipleObjects

WaitForSingleObject allows waiting for a variety of events : ChangeNotification, ConsoleInput, Event, Mutex, Process termination, Semaphore, Thread termination, Timer.
WaitforSingleObject(Handle_of_the_object,timeout);
WaitforMultipleObjects can wait for a number of events at the same time. It is what the ADA 'select' statement does.
WaitForMultipleObjects(NumberOfEvents,PtrToHandleA rray,WaitAll,timeout);
man kann das doch mit WaitForSingleObject machen. dafür benötigt man einen Timeout. Kann man das Timeout berechnen oder deaktiveren


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:27 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