Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Thread für kurze Zeit aussetzen lassen (https://www.delphipraxis.net/90502-thread-fuer-kurze-zeit-aussetzen-lassen.html)

3_of_8 18. Apr 2007 16:08


Thread für kurze Zeit aussetzen lassen
 
Morgen.

Ich hab folgenden Code in der Execute-Methode meines Threads:

Delphi-Quellcode:
procedure TBSBoardRefreshThread.Execute;
var LastMs, Ms: Integer;
begin
  LastMs:=trunc(GetTime*24*60*60*1000);

  while not Terminated do
  begin
    Ms:=trunc(GetTime*24*60*60*1000);
    if assigned(FBoard) and (Ms>LastMs) then FBoard.Refresh(Ms-LastMs);
    LastMs:=Ms;
  end;
end;
Das Problem: Erstens läuft der Thread so schnell er nur kann und blockiert damit meinen Hauptthread. Der Hauptthread findet das gar nicht witzig und lässt meine GUI freezen.

Eigentlich logisch. Aber wie verhindern? Wenn ich hintendran ein Sleep(0) dranhänge, gehts nicht und bei Sleep(10) auch nicht. Die GUI reagiert immer noch nicht.

Meflin 18. Apr 2007 16:13

Re: Thread für kurze Zeit aussetzen lassen
 
Wie wärs mit Thread-Priorität ändern?
MSDN-Library durchsuchenSetThreadPriority


3_of_8 18. Apr 2007 16:16

Re: Thread für kurze Zeit aussetzen lassen
 
Mir wäre es lieber, wenn ich sagen könnte z.B. alle 10 ms.

Christian Seehase 18. Apr 2007 16:16

Re: Thread für kurze Zeit aussetzen lassen
 
Moin Manuel,

das sieht mir ganz danach aus, als würdest Du eine VCL-Komponente aus dem Thread heraus direkt ansprechen:
Mach' das über Hier im Forum suchenSynchronize, dann dürfte da auch nichts mehr blockieren.

3_of_8 18. Apr 2007 16:17

Re: Thread für kurze Zeit aussetzen lassen
 
Sieht so aus, ist es aber nicht. ;)

Das hat mit VCL überhaupt nichts zu tun, das einzige, was da VCL ist, ist TThread, das ich benutze.

Meflin 18. Apr 2007 16:27

Re: Thread für kurze Zeit aussetzen lassen
 
Zitat:

Zitat von 3_of_8
Mir wäre es lieber, wenn ich sagen könnte z.B. alle 10 ms.

Was alle 10 ms :gruebel:


MStoll 18. Apr 2007 16:35

Re: Thread für kurze Zeit aussetzen lassen
 
Hallo,

also ich glaube, dass einzige, was diesem Stück Code fehlt, ist ein Sleep(x) mit x irgendwas zwischen 1 und 10 oder auch mehr, je nach dem, wie lange der Thread ruhen soll. Und du lässt das TThread.Execute auch sicher mittels Resume laufen? Also nirgends ein direkter Aufruf von Execute? Die Symptome sprechen dafür. In meinen Programmen kann ich auch locker mal 10 Threads laufen lassen und die GUI friert nicht ein, solange nur in jedem Thread ein Sleep(1) am Ende der Schleife steht.

Gruß
Michael

[Edit]Was macht eigentlich das FBoard.Refresh(Ms-LastMs); ?[/Edit]

3_of_8 18. Apr 2007 17:01

Re: Thread für kurze Zeit aussetzen lassen
 
Momentan macht das Refresh gar nichts.

Und ein Sleep(0), Sleep(1), Sleep(10) am Ende bringt gar nichts.

Ich rufe den Thread 1 mal mit Execute; auf und danach läuft er in seiner Schleife weiter, bis ihm gesagt wird, er soll aufhören.

Was genau meinst du mit Resume? Darf man Execute nicht aufrufen oder wie? *kratz*

EDIT: D'oh, logisch. Natürlich darf ich Execute nicht aufrufen, weil es dann im Haupt-Thread läuft. Ich probiers mal lieber mit Resume.

Zacherl 18. Apr 2007 17:10

Re: Thread für kurze Zeit aussetzen lassen
 
Passiert mir andauerd dieser Fehler .. sau blöd :wall: Mit resume wirds gehen .. ist immer so ..

NormanNG 18. Apr 2007 17:12

Re: Thread für kurze Zeit aussetzen lassen
 
Hi,

wenn du Thread.Execute aufruft, wird es einfach im Kontext des Hauptthreads ausgeführt - also nicht in einem eigenen Thread...
Versuchs mal mit Thread.Resume.

/Edit: zu spät, aber: kein roter Kasten?


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:49 Uhr.
Seite 1 von 2  1 2      

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