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:
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.
Unit2:
Delphi-Quellcode:
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.
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).
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