AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Überlappendes Application. ProcessMessages macht Unsinn
Thema durchsuchen
Ansicht
Themen-Optionen

Überlappendes Application. ProcessMessages macht Unsinn

Ein Thema von Proddi · begonnen am 24. Feb 2004 · letzter Beitrag vom 27. Feb 2004
 
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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz