Avatar billede spectual Nybegynder
15. oktober 2001 - 14:41 Der er 4 kommentarer og
3 løsninger

Eksempel på brugen af TEvent class\'en

Kan nogle give mig et eksempel på hvordan man bruger tevent class\'en?

Dvs. oprettelsen af en event og \"triggering\" af en event
Avatar billede martinlind Nybegynder
15. oktober 2001 - 14:45 #2
Def:

TMyEvent = procedure Test( Sender : TObject; MyString : String ) of Object;

TMyObj = Class;
  FMyEvent : TMyEvent;
  procedure DoMyEvent;
end;

procedure DoMyEvent;
begin
  if Assigned(FMyEvent) then FMyEvent(Self,\'Slam\');
end;
Avatar billede martinlind Nybegynder
15. oktober 2001 - 14:47 #3
TMyObj = Class;
  FMyEvent : TMyEvent;
  procedure DoMyEvent;
published
  property OnMyEvent : TMyEvent read FMyEvent write FMyEvent;
end;

Så kommer den frem i ObjectInpectoren
Avatar billede spectual Nybegynder
15. oktober 2001 - 15:06 #4
Mit problem er egentlig lidt anderledes.

Betragt følgende program:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
  procedure time_is_up (sender : tobject);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  test : tevent;
  tid : ttimer;
implementation

{$R *.DFM}

procedure tform1.time_is_up (sender : tobject);
begin;
test.SetEvent;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
si : tsecurityattributes;

begin

si.nLength := sizeof (tsecurityattributes);
si.lpSecurityDescriptor := nil;
si.bInheritHandle := true;

test := tevent.Create (@si, true, false, \'testevent\');

test.ResetEvent;

tid := ttimer.Create (nil);
tid.enabled := false;
tid.Interval := 5000;
tid.OnTimer := time_is_up;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
tid.enabled := true;

waitforsingleobject (test.handle, INFINITE);

showmessage (\'time is up!\');
end;

end.

Programmet virker ikke som det skal fordi at den ikke kommer videre fra \"waitforsingleobject\".

Hvad skal jeg gøre for at få det til at virke?
Avatar billede spectual Nybegynder
15. oktober 2001 - 18:08 #5
Her er en måde at løse det på:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
  procedure time_is_up (sender : tobject);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  test : tevent;
  tid : ttimer;
implementation

{$R *.DFM}

procedure tform1.time_is_up (sender : tobject);
begin;
test.SetEvent;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
si : tsecurityattributes;

begin

si.nLength := sizeof (tsecurityattributes);
si.lpSecurityDescriptor := nil;
si.bInheritHandle := true;

test := tevent.Create (@si, true, false, \'testevent\');

test.ResetEvent;

tid := ttimer.Create (nil);
tid.enabled := false;
tid.Interval := 5000;
tid.OnTimer := time_is_up;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
tid.enabled := true;

repeat
    Application.ProcessMessages;
  until WaitForSingleObject(test.handle, 0) <> WAIT_TIMEOUT;

showmessage (\'time is up!\');
end;

end.
Avatar billede spectual Nybegynder
15. oktober 2001 - 18:19 #6
og hvis man vil undgå at den ikke sluger *al* CPU kraften mens den kører:

</SNIP>

procedure TForm1.Button1Click(Sender: TObject);
begin
tid.enabled := true;

repeat
    Application.ProcessMessages;
    sleep (5);
  until WaitForSingleObject(test.handle, 0) <> WAIT_TIMEOUT;

showmessage (\'time is up!\');

tid.enabled:=false;
end;

end.
Avatar billede franzthomsen Nybegynder
15. oktober 2001 - 21:40 #7
Det er nøjagtig samme problemstilling som det spørgsmål jeg stillede lige før. Her endte det så med en sleep midt i det hele igen. Det med at den hænger er fordi det er WaitForSingleObject du bruger. Hvis du bruger MsgWaitForMultibleObjects undgår du, at den hænger. Det er msg, der gør forskellen. Der er så vidt jeg ved også en MsgWaitForSingleObjects, men den understøttes ikke i Delphi. Det betyder imidlertid ikke noget, da det bare er at sætte NoObjects til 1.

Bare mine 25 cents :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester