Soooo, ich hatte nun im Urlaub mal ein wenig Zeit, um mal wieder etwas für mein Projekt zu tun. Dabei wollte ich mich auch mit der Thematik der Threads befassen. Idealerweise liefert Delphi hier ja ein kleines Beispiel, welches ich zum besseren Verständis mal ein wenig gekürzt habe:
Es handelt sich um eine Form, mit 2 Buttons. Button1 startet bzw. erzeugt einen neuen Thread, Button2 Zeigt ein Nachrichtenfenster:
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls;
type
TForm1 =
class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
procedure ThreadDone(Sender: TObject);
public
end;
var
Form1: TForm1;
implementation
uses unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
with TTestThread.Create()
do
OnTerminate := ThreadDone;
showmessage('
Button1Click');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
showmessage('
Event');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
//
end;
procedure TForm1.ThreadDone(Sender: TObject);
begin
showmessage('
Thread done!');
end;
end.
Das Thread-Objekt:
Delphi-Quellcode:
unit Unit2;
interface
uses
Classes;
type
TTestThread =
class(TThread)
private
procedure doanything();
protected
procedure Execute;
override;
procedure anything;
public
constructor Create();
end;
implementation
constructor TTestThread.Create();
begin
inherited Create(False);
end;
procedure TTestThread.doanything;
var r,x,y,z:integer;
begin
r:=0;
for x:=1
to 1000
do
for y:=1
to 1000
do
for z:= 1
to 1000
do
r:=r+z;
end;
procedure TTestThread.anything;
var x,y:integer;
begin
Synchronize(Doanything);
end;
procedure TTestThread.Execute;
begin
anything;
end;
end.
Mein Verständnis hierzu ist nun, dass Button2 unabhängig von Button1 immer reagiert, also die Message 'Event' angezeigt wird. Dazu hätte ich erwartet, dass 'Button1Click' vor Beenden des Threads angezeigt wird. Tatsächlich reagiert solang die Schleifen laufen die Form nicht und keine der 2 Meldungen erscheint. Kann mir jemand erklären, wo mein Denkfehler dabei liegt? Ebenfalls würde mich interesseiren, ob ich die Methode doanything auch direkt aus der execute-Methode aufrufen kann (im Sort-Beispiel wird dieser "Umweg" gegangen...), also:
Delphi-Quellcode:
procedure TTestThread.Execute;
Synchronize(Doanything);
end;
end.
Danke für eure Hilfe!!!