AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

konsole anwendung und timer...

Ein Thema von agm65 · begonnen am 15. Feb 2006 · letzter Beitrag vom 15. Feb 2006
Antwort Antwort
Benutzerbild von agm65
agm65

Registriert seit: 21. Okt 2003
1.194 Beiträge
 
Delphi 2006 Professional
 
#1

konsole anwendung und timer...

  Alt 15. Feb 2006, 19:34
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
  Mit Zitat antworten Zitat
Tubos

Registriert seit: 25. Feb 2004
Ort: Yspertal (Niederösterreich)
1.014 Beiträge
 
Delphi 7 Personal
 
#2

Re: konsole anwendung und timer...

  Alt 15. Feb 2006, 19:41
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.
Lukas
  Mit Zitat antworten Zitat
Benutzerbild von agm65
agm65

Registriert seit: 21. Okt 2003
1.194 Beiträge
 
Delphi 2006 Professional
 
#3

Re: konsole anwendung und timer...

  Alt 15. Feb 2006, 19:46
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;
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#4

Re: konsole anwendung und timer...

  Alt 15. Feb 2006, 21:51
Ich fange mal so an:
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.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von agm65
agm65

Registriert seit: 21. Okt 2003
1.194 Beiträge
 
Delphi 2006 Professional
 
#5

Re: konsole anwendung und timer...

  Alt 15. Feb 2006, 22:47
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... ?
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#6

Re: konsole anwendung und timer...

  Alt 15. Feb 2006, 23:30
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.)
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von agm65
agm65

Registriert seit: 21. Okt 2003
1.194 Beiträge
 
Delphi 2006 Professional
 
#7

Re: konsole anwendung und timer...

  Alt 15. Feb 2006, 23:59
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:09 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