![]() |
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
|
Re: konsole anwendung und timer...
Wenn du eine gewisse Zeit lang warten willst:
![]() Wenn du eine bestimmte Aktion immer wieder ausführen willst: Schleife und Sleep kombinieren. |
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; |
Re: konsole anwendung und timer...
Ich fange mal so an:
Zitat:
![]()
Delphi-Quellcode:
Besser und einfacher ist es wie beschrieben mit einem Thread zu arbeiten.
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.
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. |
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... ?
|
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.) |
Re: konsole anwendung und timer...
okay ich habs, thread war das stichwort...aber viel simpler
Delphi-Quellcode:
danke allen
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); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz