Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi konsole anwendung und timer... (https://www.delphipraxis.net/63233-konsole-anwendung-und-timer.html)

agm65 15. Feb 2006 18:34


konsole anwendung und timer...
 
hallo leute ...ich suche nach einer möglichkeit einen timer in einer konsole anwendung unter zu bringen ...aber nicht luckies timer, der macht meine exe zu groß wegen der uses...hat jemand noch eine idee ? danke mfg

Tubos 15. Feb 2006 18:41

Re: konsole anwendung und timer...
 
Wenn du eine gewisse Zeit lang warten willst: MSDN-Library durchsuchenSleep
Wenn du eine bestimmte Aktion immer wieder ausführen willst: Schleife und Sleep kombinieren.

agm65 15. Feb 2006 18:46

Re: konsole anwendung und timer...
 
ja habe ich beides versucht ..ich mach dir mal ein beispiel:


Delphi-Quellcode:

 i:=0;

 while i=0 do
 begin
    getlogtext     <--holt mir einen text aber das kann dauern bis zu 30 sekunden

   if logtext <> '' then   <--sobald der logtext sich ändert fängt er jetzt an zu
   begin                      warten und soll mir dann den text anzeigen...problem:
   sleep(5000);               da er sobald nur 1 char verändert wurde mit dem sleep
   writeln(logtext);          anfängt wird der rest des log textes nicht mehr auf den
   end;                       string übertragen...
 
end;

turboPASCAL 15. Feb 2006 20:51

Re: konsole anwendung und timer...
 
Ich fange mal so an:
Zitat:

Zitat von http://support.microsoft.com/
http://support.microsoft.com/kb/q102482/

INFO: SetTimer() sollte in Konsole-Anwendungen nicht verwandt werden
...

Zusammenfassung

SetTimer() war für die Verwendung mit einer Konsole-Anwendung nicht vorgesehen, da es erfordert, eine Meldungsschleife das Timer-Signal an der Timer-Prozedur weiterzuleiten. Dieses Verhalten kann problemlos mit einem Threads, das festgelegt wird, auf auf einem Ereignis warten, in einer Konsole-Anwendung emuliert werden.
Weitere Informationen
SetTimer() kann In Windows NT 3.1 in einer Konsole-Anwendung arbeiten aber es erfordert ein Thread in einer Schleife, die GetMessage() und DispatchMessage() aufruft.

Mann kann das mal mit diesem Konsolenprogramm versuchen: ( Die Org. C-Version: http://simplesamples.info/Windows/ConsoleTimer.php )
Delphi-Quellcode:
program Timertest;

{$APPTYPE CONSOLE}

uses
  Windows, Messages;

procedure TimerProc(hwnd: HWND; uMsg: UINT; idEvent: UINT; dwTime: DWORD);
begin
  Writeln('Time: ', dwTime);
end;

var
  Counter: Integer = 0;
  Msg: TMsg;
  TimerID: Cardinal;

BEGIN
  TimerId := SetTimer(0, 10, 500, @TimerProc); // Timer setzen
  if TimerId = 0 then
  begin
    Writeln('Timer konnte nicht initialisiert werden.');
    halt;
  end;

  while GetMessage(Msg, 0, 0, 0) do
  begin
    inc(Counter);
    if Msg.message = WM_TIMER then
    begin
      writeln('Counter: ', Counter, ', timer message');
    end else
    begin
      writeln('Counter: ', Counter, ', Message: ', Msg.message);

      DispatchMessage(Msg);
    end;
  end;

  beep(880,25);
  KillTimer(10, TimerId); // Timer löschen
END.
Besser und einfacher ist es wie beschrieben mit einem Thread zu arbeiten.

Delphi-Quellcode:
program Threadtest;

{$APPTYPE CONSOLE}

uses
  Windows;

var
  hConsoleInput,
  hConsoleOutput: THandle;
  Msg: TMsg;
  ThreadID: Cardinal;
  ProgramEnd: Boolean;

function KeyPressed: Boolean;
var
  NumberOfEvents: DWORD;
  NumRead: DWORD;
  InputRec: TInputRecord;
begin
  Result := False;
  GetNumberOfConsoleInputEvents(hConsoleInput, NumberOfEvents);
  if NumberOfEvents > 0 then
    if PeekConsoleInput(hConsoleInput, InputRec, 1,NumRead) then
    begin
      if (InputRec.EventType = KEY_EVENT) and
        (InputRec.Event.KeyEvent.bKeyDown) then Result := True
        else ReadConsoleInput(hConsoleInput, InputRec, 1, NumRead);
    end;
end;

function MyThreadFunc(Parameter: Pointer): Integer;
begin
  Result := 0;

  repeat
    Beep(440, 50);
    SetConsoleTextAttribute(hConsoleOutput, 1+Random(15));
    Sleep(500);
  until ProgramEnd;

  EndThread(0);
end;

BEGIN
  hConsoleOutput := GetStdHandle(STD_OUTPUT_HANDLE);
  hConsoleInput := GetStdHandle(STD_INPUT_HANDLE);
  SetConsoleTitle('Taste druecken um Programm zu beenden.');

  BeginThread(nil, 0, MyThreadFunc, nil, 0, ThreadID);

  while not ProgramEnd do
  begin
    TranslateMessage(msg);
    DispatchMessage(msg);

    Write(Random(2));

    if KeyPressed then ProgramEnd := True;
  end;

END.

agm65 15. Feb 2006 21:47

Re: konsole anwendung und timer...
 
guter timer...aber gleiches problem wie mit der sleep funktion...leider, mir kommt es sovor als würde der timer nicht einfach warten bis das interval vorbei ist, sondern einfach alles anhalten und dann warten... ?

turboPASCAL 15. Feb 2006 22:30

Re: konsole anwendung und timer...
 
Nein, ein Timer wartet nicht. Eine Eieruhr wartet ja auch nicht ob das Ei fertig ist oder nicht.
Verwende einen Thread.

Ein Einfaches Beispiel habe ich oben hinzugefügt. (Hatte ich vorhin vergessen.)

agm65 15. Feb 2006 22:59

Re: konsole anwendung und timer...
 
okay ich habs, thread war das stichwort...aber viel simpler

Delphi-Quellcode:
function GetLogText(Parameter : Pointer) : Integer;
begin
while true do begin
 writeln(logtext);
 sleep(5000);
end;
end;

var
id1:LongWord;

BeginThread(nil, 0, Addr(GetLogText), nil, 0, id1);
danke allen


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz