![]() |
Threads: Verständnisproblem!?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich habe mir ein kleines Programm gebastelt, in dem es mir lediglich darum ging, das Verhalten eines Threads auszuprobieren. Leider tut das Programm nicht was ich will. Geplant ist es wie folgt (siehe Anhang UI): Ich möchte einen Startbutton drücken. In dem Moment soll der Thread starten und die Caption eines Labels im Sekundentakt hochzählen (also quasi wie ein kleiner Timer). Diese Anzeige dient lediglich dazu, zu sehen wie der Thread läuft. Parallel dazu möchte ich jetzt, noch während der Thread läuft, einen zweiten Button "Ändern" drücken, der die Caption eines zweiten Labels zwischen "Eins" und "Zwei" ändert. Quellen dazu: Unit1:
Delphi-Quellcode:
Unit2:
unit ThreadTest;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Unit2; type TForm1 = class(TForm) lbl1: TLabel; btn1: TButton; btn2: TButton; lbl2: TLabel; procedure btn2Click(Sender: TObject); procedure btn1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public MyThread: TMyThread; { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.btn2Click(Sender: TObject); begin if lbl2.Caption = 'Eins' then begin lbl2.Caption := 'Zwei'; end else begin lbl2.Caption := 'Eins'; end; end; procedure TForm1.btn1Click(Sender: TObject); begin if btn1.Caption = 'Start' then begin btn1.Caption := 'Stop'; MyThread.Execute; end else begin btn1.Caption := 'Start'; MyThread.Terminate; end; end; procedure TForm1.FormCreate(Sender: TObject); begin MyThread := TMyThread.Create(True); MyThread.FreeOnTerminate := True; end; end.
Delphi-Quellcode:
Wie gesagt, das ganze dient nur als Test, weitere Aktionen ausführen zu können, während ein Thread nebenher andere Dinge tut (eben so wie das Ganze gedacht ist).
unit Unit2;
interface uses classes, StdCtrls, SysUtils; type TMyThread = class(TThread) procedure Execute; override; public end; implementation uses ThreadTest; procedure TMyThread.Execute; var num: Integer; begin while (not terminated) do begin num := StrToInt(ThreadTest.Form1.lbl1.Caption); Inc(num, 1); ThreadTest.Form1.lbl1.Caption := IntToStr(num); Sleep(800); ThreadTest.Form1.lbl1.Refresh; end; end; end. Leider blockiert mein Programm nach dem Starten des Threads, wie eine Endlosschleife und ich kann weder den Button "Ändern", noch den Stop-Button drücken. Ich wäre sehr dankbar, wenn mir jemand meinen Fehler aufzeigen und auch erklären kann! Mit freundlichen Grüßen Nightjacket |
AW: Threads: Verständnisproblem!?
Drei Fehler fallen mir spontan auf:
|
AW: Threads: Verständnisproblem!?
könnte so oder ähnlich aussehen ...
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TMyThread = class(TThread) Private FNum: Integer; procedure Execute; override; procedure IncNum; public end; TForm1 = class(TForm) lbl2: TLabel; lbl1: TLabel; btn2: TButton; btn1: TButton; procedure btn2Click(Sender: TObject); procedure btn1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private procedure CreateMyThread; { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; MyThread: TMyThread; implementation {$R *.dfm} procedure TForm1.btn2Click(Sender: TObject); begin if lbl2.Caption = 'Eins' then begin lbl2.Caption := 'Zwei'; end else begin lbl2.Caption := 'Eins'; end; end; procedure TForm1.btn1Click(Sender: TObject); begin if btn1.Caption = 'Start' then begin btn1.Caption := 'Stop'; CreateMyThread; MyThread.Start; end else begin btn1.Caption := 'Start'; MyThread.Terminate; MyThread := nil; end; end; procedure TForm1.CreateMyThread; begin if not Assigned(MyThread) then begin MyThread := TMyThread.Create(true); MyThread.FreeOnTerminate := true; end; end; procedure TForm1.FormCreate(Sender: TObject); begin CreateMyThread; end; procedure TMyThread.IncNum; begin FNum := StrToInt(Form1.lbl1.Caption); Inc(FNum, 1); Form1.lbl1.Caption := IntToStr(FNum); end; procedure TMyThread.Execute; begin while (not terminated) do begin Synchronize(IncNum); Sleep(800); end; end; end. |
AW: Threads: Verständnisproblem!?
Danke schonmal so weit, hat mir beides in meinem Verständnis davon ein Stück weitergeholfen! :wink:
Jetzt hab ich aber noch ein Problem: Wenn ich es nun, wie von euch angemerkt, umschreibe, dann kennt er die Methode MyThread.Start nicht. Ist dafür noch etwas zu beachten? |
AW: Threads: Verständnisproblem!?
Zitat:
|
AW: Threads: Verständnisproblem!?
Ja, deine Delphi Version (die du ja in deinem Profil nicht angegeben hast).
In neueren Versionen nimmt man ![]() In älteren Versionen nimmt man ![]() |
AW: Threads: Verständnisproblem!?
In älteren Delphi-Versionen gibt es noch keine Start-Methode, da musst Du Resume nehmen.
[edit] *Pfüh* [/edit] |
AW: Threads: Verständnisproblem!?
Dann nimm Resume statt Start, oder nimm CreateMyThread aus dem FormCreate heraus und ändere CreateMyThread so daß der Thread direkt losläuft.
Delphi-Quellcode:
procedure TForm1.CreateMyThread;
begin if not Assigned(MyThread) then begin MyThread := TMyThread.Create(false); MyThread.FreeOnTerminate := true; end; end; |
AW: Threads: Verständnisproblem!?
Ja danke, wollte grad editieren das ich es herausfand. Bei mir ist es Delphi 7 und da trifft eben Resume zu.
Werd' das mit der Version gleich mal nachholen, für künftige Fragen.. :oops: Aber danke nochmals an alle, funktioniert nun wie gewünscht! :) |
AW: Threads: Verständnisproblem!?
Zitat:
Delphi-Quellcode:
? Dann muss man sich nicht mit dem (hier natürlich eigentlich gar nicht) bösen Resume herumschlagen. Denn besser ist es doch, diese Methode einfach zu verschweigen.
myThread := TMyThread.Create(False);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:32 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 by Thomas Breitkreuz