Threads und events

Hallo,
ich möchte aus meiner Hauptanwendung heraus (einer Konsolenanwendung) einen Thread erzeugen und starten. Danach arbeitet die Hauptanwendung normal weiter, ohne jemals auf die Beendigung des Threads zu warten, d.h. der Thread macht seinen Job und beendet sich schließlich selbst.

Der Thread soll (in dem Hier gewählten Beispiel) einen Timer starten, der alle 100ms ein Event auslöst. Jedes mal wenn das Event ausgelöst wird, soll eine Ausgabe auf der Konsole gemacht werden.

Mein Problem bei der ganzen Sache ist, dass ich es nicht hinbekomme, dass der Thread das Event mitbekommt bzw. die Prozedur zur Behandlung des Events aufgerufen wird.

Ich weiß nicht mehr weiter. Vielen Dank für die Hilfe!
Veit

_//MyThread.pas_
**unit** MyThread;

**interface**

**uses**
 Forms,
 SysUtils,
 ExtCtrls,
 Classes;

**type**
 TMethodPointer = record
 pMethod: Pointer;
 pObject: TObject;
 **end;**

 TMyThread = **class** (TThread)
**constructor** Create( CreateSuspended: Boolean );
**procedure** NotifyEvent(Sender: Tobject);
 **private**
 p : TMethodPointer;
 t : TTimer;
 **protected**
**procedure** Execute; **override** ;
 **end** ;

**implementation**

**constructor** TMyThread.Create( CreateSuspended: Boolean );
**begin**
**inherited** Create( CreateSuspended );
 p.pMethod := @TMyThread.NotifyEvent; 
 p.pObject := **nil** ;
 t := TTimer.Create( **nil** );
 t.Enabled := false; _//deaktiviert timer_ 
 t.Interval := 100; _//alle 100ms ein OnTimerEvent_
 t.OnTimer := TNotifyEvent(p); _//Prozedur dem OnTimerEvent zuordnen_
**end** ;




**procedure** TMyThread.NotifyEvent(Sender: TObject);
**begin**
 writeln('Ja, event behandelt');
 SysUtils.Beep;
**end** ;




**procedure** TMyThread.Execute;
**var**
 i : integer;
**begin**
 t.Enabled := true; _// aktiviert den Timer_
**for** i := 1 **to** 10 do **begin**
 sleep(50);
 writeln('warte auf event');
 Application.ProcessMessages; _//eventliste abarbeiten :frowning:scheint nicht zu wirken)_
 **end** ;
 t.Enabled := false; _// deaktiviert den Timer_
**end** ;

**end**.

Hallo,
versuche Mal excute manuell aufzurufen Z.B. in Create Procedure.
Gruß

unit TestMyThread;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
Uses MyThread;

VAR _Thread : Tmythread;
procedure TForm1.Button1Click(Sender: TObject);
begin
If _Thread = NIL
then _Thread := TMythread.Create(true)
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
If _Thread.Threadactive then
begin
_Thread.Suspend;
_Thread.Threadactive := False;
_Thread.t.Enabled := False;
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
If NOT _Thread.Threadactive then
begin
_Thread.Resume;
_Thread.Threadactive := true;
_Thread.t.Enabled := true;
end;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
_Thread.Terminate;
Close;
end;

end.

====================================================
unit MyThread;
interface
uses Forms, SysUtils, ExtCtrls, Classes;
type TMethodPointer = record
pMethod: Pointer;
pObject: TObject;
end;
TMyThread = class(TThread)
constructor Create( CreateSuspended: Boolean );
procedure NotifyEvent(Sender: Tobject);
procedure Execute; override;
Public
t : TTimer;
Threadactive : Boolean;
end;
implementation
Uses TestMyThread;
constructor TMyThread.Create( CreateSuspended: Boolean );
begin
inherited Create( CreateSuspended );
t := TTimer.Create(NIL);
t.Enabled := false; //deaktiviert timer
t.Interval := 100; //alle 100ms ein OnTimerEvent
t.OnTimer := NotifyEvent; //Prozedur dem OnTimerEvent zuordnen
// resume;

procedure TMyThread.NotifyEvent(Sender: TObject);
begin
Form1.Memo1.Lines.Add(‚Ja, event behandelt‘);
SysUtils.Beep;
end;

procedure TMyThread.Execute;
var i : integer;
begin
t.Enabled := true; // aktiviert den Timer
while (not Terminated) do
begin
sleep(100);
Form1.Memo1.Lines.Add(‚warte auf event‘);
Application.ProcessMessages;
end;
t.Enabled := false; // deaktiviert den Timer
Form1.Memo1.Lines.Clear;
end;

end.

die dfm Datei dazu

object Form1: TForm1
Left = 192
Top = 188
Width = 376
Height = 189
Caption = ‚Form1‘
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = ‚MS Sans Serif‘
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 0
Top = 0
Width = 89
Height = 25
Caption = ‚Create Thread‘
TabOrder = 0
OnClick = Button1Click
end
object Memo1: TMemo
Left = 104
Top = 8
Width = 249
Height = 137
Lines.Strings = (
‚Memo1‘)
TabOrder = 1
end
object Button2: TButton
Left = 8
Top = 32
Width = 75
Height = 25
Caption = ‚suspend‘
TabOrder = 2
OnClick = Button2Click
end
object Button3: TButton
Left = 8
Top = 72
Width = 75
Height = 25
Caption = ‚resumé‘
TabOrder = 3
OnClick = Button3Click
end
object Button4: TButton
Left = 8
Top = 112
Width = 75
Height = 25
Caption = ‚Terminate‘
TabOrder = 4
OnClick = Button4Click
end
end