Timer w aplikacji konsolowej

0

Czesc,
chcialbym prosic Was o pomoc. Czy da sie zrobic w aplikacji konsolowej timer?

Dokladnie chodzi mi o to aby moc odpalic jakas funkcje przy podanej w zmiennych dacie i godzinie.

pozdrawiam !

0

obawiam się że się nie da bo aplikacja konsolowa oprócz komunikatów "klawiaturowych' chyba nie przetwarza pozostałych komunikatów od systemu a w szczególności WM_TIMER

2

A stworzenie ukrytego okna przez CreateWindow i przy tworzeniu w WM_CREATE ustawienie exstylu okna jako ToolWindow by znikneła belka na pasku zadań. Następnie wywołanie SetTimer dla uchwytu tego okna nie wchodzi w grę? Ja tak bym pokombinował.

1

Nie mam czasu pisać więcej ale http://docwiki.embarcadero.com/Libraries/XE8/en/System.Classes.AllocateHWnd

EDIT:
zresztą jak mozna przeczytać Timer już to robi więc:

program Project1;

{$APPTYPE CONSOLE}

uses
  Forms, SysUtils, Classes, ExtCtrls;


var
  Done: Boolean;
  Timer: TTimer;
  Method: TMethod;

procedure OnTimer(Sender: TObject);
begin
  //tu kod ktory ma sie wykonac i sprawdzanie czasu
  Done:= True;
end;

begin
  Done:= False;
  Timer:= TTimer.Create(nil);
  try
  Method.Data := Timer;
  Method.Code := @OnTimer;
  Timer.OnTimer:= TNotifyEvent(Method);
  while not Done do
    Application.ProcessMessages;
  finally
    Timer.Free;
  end;
end.
0

kiedyś potrzebowałem odpalić TTimera w klasie dziedziczącej z klasy TDSServerModule, nie udało się i musiałem znależć zupełnie inne rozwiązanie problemu , a pomysł @olesio jest bardzo ciekawy

0

@grzegorz_so Nie wiem co robiłeś ale jak widać można... bo TTimer używa wspomnianej funkcji (AllocateHWnd) do stworzenia ukrytego okna zapewniającego obsługę komunikatów o czym można przeczytać w dokumentacji (link wyżej) a rozwiązanie @olesio to dokładnie to samo tyle że w czystym WinApi.

0

to co robiłem to było dawno, po kilku nieudanych próbach z Ttimer znalazłem zupełnie inne rozwiązanie mojego problemu . a post @karpov'a przywołał mi tamten problem

@kAzek, proste umieszczenie TTimera w klasie TDSServerModule nie dało oczekiwanego rezultatu, może zrobiłem jakiś błąd o którym nie wiem . czy aby na pewno TTImer tworzy własne ukryte okno do obsługi komunikatów ?

0
grzegorz_so napisał(a):

czy aby na pewno TTImer tworzy własne ukryte okno do obsługi komunikatów ?

http://docwiki.embarcadero.com/Libraries/XE8/en/System.Classes.AllocateHWnd

Call AllocateHWnd to create a window that is not associated with a windowed control. Typically, this method is used to create non-visual windows that respond to messages but that do not appear in the user interface. For example, the TTimer component uses this method to create a window that responds to timer messages from Windows.

0

Ostatnio piszę sobie w dawno nie eksploatowanym przeze mnie na taką skalę WinAPI. Tak że widząc pytanie o Timer i sugestię o braku obsługi komunikatu WM_TIMER w odpowiedzi. Jakby automatycznie mój tok myślenia szedł w kierunku WinAPI i SetTimer. Bez zaprzęgania do tego opasłych modułów VCL.

Jakoś nie pamiętałem lub nawet nie znałem typu TMethod. Ale AllocateWnd używałem tłumacząc na WinAPI kod modułu do obsługi TrayIcon. Ale nie zagłebiałem się bardziej w pewne metody skopiowane ze źródel VCL. Wiem tylko że ta Allocate tworzy właśnie ukryte okno. Piszę to tak btw.

1 użytkowników online, w tym zalogowanych: 0, gości: 1