Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Thread ist mit einer Aufgabe fertig: Mainthread mitteile

  Alt 3. Apr 2008, 00:26
Wie erzeugst du den Thread? Mit der TThread-Klasse der VCL oder mit BeginThread? Wenn ersteres, die Thread-Klasse kennt das Ereignis OnTerminate, welches aufgerufen wird, wenn die Execute Methode verlassen wird. Arbeitest du mit BeginThread, dann schick eine Nachricht an dein Hauptthread (const TM_FINISH = WM_USER + 1). Abfangen kannst du die Nachricht, in dem du die WndProc deiner Form überschreibst und gezielt auf deine Nachricht reagierst.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure WndProc(var Message: TMessage); override;
  end;

var
  Form1: TForm1;

const
  TM_FINISH = WM_USER +1 ;

type
  TThreadParams = record
    FHandle: THandle;
  end;
  PThreadParams = ^TThreadParams;

implementation

{$R *.dfm}

function Thread(p: Pointer): Integer;
var
  Handle: THandle;
begin
  Handle := PThreadParams(p)^.FHandle;
  SendMessage(Handle, TM_FINISH, 0, 0);
  Result := 0;
  Dispose(p);
end;

procedure TForm1.WndProc(var Message: TMessage);
begin
  inherited;
  case Message.Msg of
    TM_FINISH: ShowMessage('Fertig');
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  tp: PThreadParams;
  ThreadID: Cardinal;
begin
  New(tp);
  tp.FHandle := Handle;
  CloseHandle(BeginThread(nil, 0, @Thread, tp, 0, ThreadID));
end;

end.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat