Ich habe folgenden Code:
mit WaitForRequest wird ein Wert (über
TCP) angefordert, ReqUID ist ein Objekt. Eine Schreibroutine,welches die ReqUID füllt funktioniert ebenfalls.
ReqUID ist ein Item aus einer Liste, wenn mehrere Anforderungen zur gleichen Zeit erfolgen. Der ermittelte Wert wird dann in das UID-Obkelt geschrieben, welches am längsten auf den Wert wartet.
Klappt soweit alles bis auf folgendes Szenario:
Ich habe 2 Requests (gleichzeitig), sprich, WaitForRequest(jeweils andere UID) wird 2x aufgerufen und damit auch das Application.ProcessMessages.
jetzt schreib ich einen Wert in das erste UID und ändere UID.RequestStatus = rsRequested und damit soll das WHILE abgebrochen werden. Pustekuchen. erst wenn ich den 2. Wert geschrieben habe und damit alle (wartenden) UIDs auf rsRequestet gesetzt habe gehts weiter.
Ich vermute, daß mit dem 2. Aufruf von WaitForRequest (und damit ProcessMessages) der erste auf Aussetzen ist und damit das WHILE nicht abgebrochen wird (siehe LOG unten)
Code:
// WERTEANFORDERUNG klappt
if WaitForRequest(ReqUID) then begin ....
Code:
// Wartet bis Wert da ist oder TimeOut - und hier steckt ein Fehler oder Seiteneffekt
function TCallbackValue.WaitForRequest(const UID:TCBUID):boolean;
const OneMilliSecond = 1 / (24 * 60 * 60 * 1000);
begin
UID.RequestStatus := rsRequesting;
// CODE fürs Wert anfordern spielt hier keine Rolle und funzt
// Timeout setzen
UID.TimeOutTime := Now + OneMilliSecond * RequestTimeout;
// Warten
while (Now<UID.TimeOutTime) and (UID.RequestStatus = rsRequesting) do begin
LOG(UID.Index); // hier habe ich testhalber mal geloggt
Application.ProcessMessages;
end;
result := UID.RequestStatus = rsRequested;
end;
das LOG der gesamte Geschichte (siehe ProcessMessages-Code):
/request #1 (UID#1)
1
1
1
/request #2 (UID#2)
2
2
2
2
/schreibe UID#1 (und RequestStatus = rsRequested) -> hier soll der erste Aufruf des ProcessMessages enden, MACHT ES ABER NICHT
2
2
...
2
2
/schreibe UID#2 (und RequestStatus = rsRequested)
2
1
/fertig, beide bekommen den wert, nur daß UID#1 erst auf UID#2 gewartet hat
es ist wichtig, daß immer die älteste Anforderung den Wert bekommt.
so, ich hoffe, ihr versteht, was ich meine, HEEELLPPPP !!!!!
[edit=sakura] Leerzeichen in Titel gesetzt. Mfg, sakura[/edit]