Forum: Sonstige Fragen zu Delphi
Delphi
by RSE,
7. Dez 2012
Man hat 5 Sekunden für CTRL_CLOSE_EVENT und 20 für CTRL_LOGOFF_EVENT und CTRL_SHUTDOWN_EVENT.
http://www.codeproject.com/Articles/2357/Console-Event-Handling
Auf diesen Timeout habe ich auch im Kommentar in meinem Quelltext hingewiesen. Beziffert habe ich ihn nicht, da ich weder verlässliche Quellen (Microsoft-Dokument) noch Hinweise auf Unterschiede in verschiedenen Windows-Versionen...
Forum: Sonstige Fragen zu Delphi
Delphi
by RSE,
7. Dez 2012
Lösung: Die Prozedur ConsoleEventProc, die mit SetConsoleCtrlHandler registriert wird, läuft asynchron zum Programm in einem anderen Thread. Wenn diese Prozedur beendet wird, wird das Programm "von außen" beendet, sobald offenbar ein weiterer Thread wieder rechenzeit bekommt. Jedenfalls werden nach Beendigung der Prozedur ConsoleEventProc noch ein paar wenige Befehle ausgeführt, bevor das...
Forum: Sonstige Fragen zu Delphi
Delphi
by RSE,
5. Dez 2012
@tsteinmaurer: Wenn du meinen ersten Beitrag aufmerksam gelesen hättest, wüsstest du, dass ich genau das gleiche mit den IBDACs mache. Nur kommt der Event eben durch eine Windows-Message in dein Programm, und wenn die nie bei der Komponente ankommt, kann die den Event nicht auslösen. Und da eine Konsolenanwendung nicht von Haus aus eine Message-Schleife hat, musste ich die selbst bauen. Das wird...
Forum: Sonstige Fragen zu Delphi
Delphi
by RSE,
5. Dez 2012
Sehr richtig. Ich hatte schon Angst, dass jemand etwa sagen würde, weil ich mir ständig selbst geantwortet habe... :roll: Ich danke dir deshalb sehr für deinen Post! :-D
Forum: Sonstige Fragen zu Delphi
Delphi
by RSE,
5. Dez 2012
ReadConsole hat tatsächlich gewartet, bis eine Eingabe erfolgt, bevor es zurückkehrt. Damit hat es natürlich den restlichen Programmablauf blockiert...
Die funktionierende Lösung ist die folgende:
procedure ProcessMessages;
var
SIN: Cardinal;
Num: Cardinal;
IR: TInputRecord;
begin
SIN := GetStdHandle(STD_INPUT_HANDLE);
repeat
Forum: Sonstige Fragen zu Delphi
Delphi
by RSE,
5. Dez 2012
Wenn ich die Schleife folgendermaßen erweitere, dann kann ich das Programm zwar sauber beenden, aber dann bekomme ich die Events nicht mehr:
repeat
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
DispatchMessage(Msg)
else
if ReadConsole(GetStdHandle(STD_INPUT_HANDLE), @Key, 1, NumRead, nil) and
(NumRead > 0) then
Exit
else
Sleep(0); //...
Forum: Sonstige Fragen zu Delphi
Delphi
by RSE,
5. Dez 2012
Also mit folgendem Konstrukt empfange ich schon mal den Event:
repeat
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
DispatchMessage(Msg);
end
else
Sleep(0); // Rest der Zeitscheibe verwerfen
until False;
Forum: Sonstige Fragen zu Delphi
Delphi
by RSE,
5. Dez 2012
Könnt ich schon, aber wie soll mein Window dafür sorgen, dass der TIBCAlerter Messages empfängt? Ich weiß ja nicht mal was der als "Antwortadresse" angibt. Der Alerter registriert sich ja für Messages beim Firebird-Server, das heißt, dass der seine Antworten an irgendwen schicken muss. Ich halte es für unwahrscheinlich, dass der Alerter mein Fenster als "Antwortadresse" angibt.
Wenn man davon...