Einzelnen Beitrag anzeigen

Proddi

Registriert seit: 4. Sep 2003
9 Beiträge
 
#1

Überlappendes Application. ProcessMessages macht Unsinn

  Alt 24. Feb 2004, 20:12
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]
  Mit Zitat antworten Zitat