Einzelnen Beitrag anzeigen

WIng2005

Registriert seit: 20. Mär 2006
Ort: Thüringen
388 Beiträge
 
Delphi XE Starter
 
#12

AW: Suche Tutorial zum Thema Multithreating

  Alt 21. Aug 2012, 20:56
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!!!
MFG
Steffen
  Mit Zitat antworten Zitat