Deinen Vorschlag 1 und 3 habe ich direkt übernommen. Bei Vorschlag 2 gibt es Probleme: Der zweite Parameter von MsgWaitForMultipleObjects() ist in Delphi 2009 als var deklariert. Ich habe darum Folgendes gemacht:
Delphi-Quellcode:
var
PHandleArray: Pointer;
...
PHandleArray := @HandleArray;
while not Application.Terminated do
begin
WaitResult := MsgWaitForMultipleObjects(2, PHandleArray, False, INFINITE, QS_ALLINPUT);
if WaitResult = WAIT_OBJECT_0 + 1 then
begin
//neuen Lesevorgang starten
end
else if WaitResult = WAIT_OBJECT_0 + 2 then //Nachricht eingetroffen
Application.ProcessMessages
else //Prozessende
break;
end;
Trotzdem funktioniert auch jetzt der Code noch nicht, da WaitResult nach zwei oder drei Aufrufen von Application.ProcessMessages den Wert $FFFFFFFF zurückgibt und dann break aufgerufen wird.