Einzelnen Beitrag anzeigen

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, 20: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