![]() |
Thread für kurze Zeit aussetzen lassen
Morgen.
Ich hab folgenden Code in der Execute-Methode meines Threads:
Delphi-Quellcode:
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.
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; 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. |
Re: Thread für kurze Zeit aussetzen lassen
|
Re: Thread für kurze Zeit aussetzen lassen
Mir wäre es lieber, wenn ich sagen könnte z.B. alle 10 ms.
|
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 ![]() |
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. |
Re: Thread für kurze Zeit aussetzen lassen
Zitat:
|
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] |
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. |
Re: Thread für kurze Zeit aussetzen lassen
Passiert mir andauerd dieser Fehler .. sau blöd :wall: Mit resume wirds gehen .. ist immer so ..
|
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 00:08 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