Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
Delphi 6 Personal
|
Re: konsole anwendung und timer...
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.
|
|
Zitat
|