![]() |
Thread startet nicht sofort
Hallo,
ich habe ein Problem mit meinem Testprogramm. Und zwar wird der Thread erst gestartet nach dem der Prozess, indem ich die Funktion Create aufrufe, beendet wurde. Laut Dokumentaion sollte der Thread aber sofort nach Aufruf von Thread.Resume starten. Hat von euch vielleicht jemand eine Idee?
Delphi-Quellcode:
procedure TTest.Execute;
begin try a := 0; while (a < 100) do begin inc(a); Form1.Memo1.Lines.Add(IntToStr(a)); sleep(50); end; except on e: exception do begin end; end; end; procedure TForm1.Button1Click(Sender: TObject); var wf : DWORD; begin Thread1 := TTest.Create(True); Thread1.FreeOnTerminate := True; Thread1.Resume; sleep(5000); end; |
DP-Maintenance
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Delphi-Frage |
Re: Thread startet nicht sofort
das ist nicht richtig. der thread startet sofort.
du siehst nur nicht die ausgabe des threads. das sleep(5000) bringt den vcl thread zum schlafen, welches zu der folge hat, dass deine ausgaben nicht mehr angezeigt werden. achtung: die vcl ist nicht threadsafe! wenn du im thread ausgaben in deine vcl form machen willst, dann solltest du die beiden threads syncronisieren.
Delphi-Quellcode:
sowas direkt aufzurufen ist schlecht.
Form1.Memo1.Lines.Add(IntToStr(a));
kontaktiere mal die hilfe, dort ist ein beispiel für "syncronize()" drin. [edit] p.s. willkommen in der dp |
Re: Thread startet nicht sofort
Erstmal danke für die schnelle Antwort. Wenn ich den Code folgendermassen ändere, ist der Effekt der gleiche, obwohl der Prozess nicht "schläft".
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var hThread : Thandle; ThreadID : Cardinal; wf : DWORD; begin Thread1 := TTest.Create(True); Thread1.FreeOnTerminate := True; Thread1.Resume; while (true) do; <------Endlosschleife, nicht schön, aber geht. Wenn ich sie weglasse, startet der Thread sofort. end; |
Re: Thread startet nicht sofort
Diese Ziele veranlasst,
Delphi-Quellcode:
dass deinem Memo eine Message geschickt wird, es solle doch mal bitte den neuen Eintrag hinzufügen.
Form1.Memo1.Lines.Add(IntToStr(a));
Ob das Memo (bzw, der Thread in dem das Memo ist) nun schläft oder endlos auf der Stelle hüpft kommt aufs gleiche raus. Es kommt einfach nicht zum neu zeichnen. Dazu muss es erstmal aus der aktuellen Messagebearbeitung (au sder aktuellen Funktion etc.) raus. |
Re: Thread startet nicht sofort
Setzte einfach mal Haltepunkte (im Thread und im hauptprogramm) und du wirst sehen das beides läuft.
Aber wie die anderen bereits erwähnt haben solltest du nicht vom Thread aus auf VCL Elemente zugreifen. Ansonsten wirst du früh oder später Fehler bekommen wie "canvas does not allow drawing" oder ein Control malt sich einfach nicht mehr neu. Zudem sollte dir bewusst sein das die Grafische Ausgabe zum hauptthread gehört. Und während dieser in einer Endlosschleife hängt oder schläft kann er nicht die Oberfläche neu zeichnen (er kenn eben immer nur einwas) |
Re: Thread startet nicht sofort
Delphi-Quellcode:
So (ungefähr, ungetestet) müsste es ordentlich sein. Wenn du in deinem Test unbedingt ein Sleep möchtest, erstelle im Thread einfach eine Datei, drück den Button und guck schnell nach (innerhalb der 5 Sleep Sekunden) ob die Datei da ist...
class TTest = class(TThread)
public a: integer; [...] end; implementation procedure TTest.Execute; begin try a := 0; while (a < 100) do begin inc(a); synchronize(machsFit); sleep(50); end; except on e: exception do begin end; end; end; procedure TTest.machsFit; begin form1.memo1.lines.add(inttostr(a)); end; procedure TForm1.Button1Click(Sender: TObject); var wf : DWORD; begin Thread1 := TTest.Create(True); Thread1.FreeOnTerminate := True; Thread1.Resume; end; |
Re: Thread startet nicht sofort
einige Thread-Erstellungsfunktionen von Delphi starten wirklich nicht gleich.
füge mal ein Sleep(0); nach Thread1.Resume; ein ... mit etwas "Glück" hilft das schon. aber die Threadsaveangelegenheit bezüglich der VCL solltest du dennoch beheben. und wozu einen anderen Thraed, wenn du den Hauptthread schlafen legst (anhälst)? > Slepp und die Endlosschleife unterbrechen de Ausführung des Hauptthreads (legen diesen also sozusagen schlafen) |
Re: Thread startet nicht sofort
Hallo,
danke für die zahlreichen Antworten. Da muss ich mir wohl ein anderes Programmdesign ausdenken. zweitakt |
Re: Thread startet nicht sofort
Delphi-Quellcode:
ist wie deine sleep idee...
while (true) do;
der vcl prozess kann nicht das fenster neu malen. du siehst deine änderungen nicht.
Delphi-Quellcode:
würde deine änderungen zwar anzeigen, aber gut ist das so nicht.
while (true) do
application.processmessages; dein multithreadproblem bleibt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 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