Avatar billede baileys Nybegynder
01. maj 2003 - 23:47 Der er 4 kommentarer og
1 løsning

TimerEvent virker ikke...

Nu har jeg siddet og kogt over det her i lang tid... Og er nødsaget til at søge hjælp...

Jeg er ved at skrive en console-app, hvor jeg har , og der skal jeg bruge en timer, som trigger dens onTimer-event.

Det er sat op sådan her:

type
  Noget = class
    private
      Timer: TTimer;
      procedure TimerOnTimer(Sender: TObject);
    public
      constructor Create();
  end;

constructor Create();
begin
  Timer := TTimer.Create(nil);
  Timer.OnTimer := TimerOnTimer;
end;

---------------
  En masse procedures, functions m.m.
---------------


procedure Noget.TimerOnTimer(Sender: TObject);
begin
  // Something
end;


Det virker fint, og jeg her en Timer.Enable der bliver udløst, men min TimerOnTimer procedure bliver aldrig kørt...
Hvad kan der være glat?
Avatar billede hermandsen Juniormester
02. maj 2003 - 00:02 #1
Skal constructor'en ikke hedde
constructor Noget.Create();

Alternativt var det måske en mulighed at bruge Sleep(milisekunder); i stedet... Eller smide Sleep'eren ind i en tråd så det andet kunne køre samtidig ved siden af...

//hermandsen
Avatar billede doc404 Novice
02. maj 2003 - 00:51 #2
Så vidt jeg husker kan du ikke bruge en TTimer i en console app fordi den allokerer en window handle som ikke er tilrådighed i en console app. Du kan istedet lave nedenstående. Har selv brugt det i en DLL

var
  TimerId : integer;

procedure TimerEvent(Hnd: HWND; uMsg, idEvent: Cardinal; dwTime: DWORD); stdcall;
begin
...
end;


..initialize
  TimerId := SetTimer(0,0,<antal ms>,@TimerEvent);

..oprydning
  KillTimer(0,TimerId);
Avatar billede borrisholt Novice
02. maj 2003 - 08:33 #3
har du husket at sætte den activ ?
Jens B
Avatar billede baileys Nybegynder
02. maj 2003 - 23:27 #4
doc404 - den virker desværre heller ikke hos mig... Har fået TTimer til at virke før i Console-APP, men sjovt nok ikke nu...

  private
      TimerID: Integer;
      procedure TimerEvent(Hnd: HWND; uMsg, idEvent: Cardinal; dwTime: DWORD);

Den kaldes med:

    TimerID := SetTimer(0,0,1000,@TMyClass.TimerEvent);

Men min proceudre:

procedure MyClass.TimerEvent(Hnd: HWND; uMsg, idEvent: Cardinal; dwTime: DWORD);
var
  SiteSrc: String;
begin
  SiteSrc := FHttpClt.Get('http://'+FServer+'/update?Yid='+FYid);
  ShowMessage('Fisse');
end;

Bliver aldrig kørt...

Why?
Avatar billede doc404 Novice
03. maj 2003 - 11:01 #5
Hvis du bruger en timer SKAL du have gang i et message loop, så glem mit tidligere forslag...
Du kan selv oprette et Window til det formål, men mener at du kan løse det bedre med en thread:

program Project2;
{$APPTYPE CONSOLE}
uses SysUtils,Windows,Classes;

type
  TMyThread = class(TThread)
    procedure Execute; override;
  end;

{ TMyThread }

var
  Timer : TMyThread;
  Counter : integer;

procedure TMyThread.Execute;
begin
  while not Terminated do
  begin
    Sleep(1000);
    // det her bliver udført hvert sekund
    WriteLn(IntToStr(Counter));
    Inc(Counter);
  end;
end;

begin
  Timer := TMyThread.Create(False);
  Counter := 0;
  while Counter < 20 do {venter...}; // et eller andet der stopper programmet
  Timer.Terminate;
end.
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