![]() |
Threads Pointer und änderung des Speicherinhalts
Hallo,
ich hab ein (an sich triviales) Problem, und hab bis jeztzt nicht herausgefunden woran es liegt. Mein Dienst sendet Reqests über TCP/IP an ein Server Propgramm und wartet auf eine Antwort, welche manchmal nicht sofort kommt. Nun gibt es einen Thread, der also darauf wartet, ob sich der Inhalt einer Variable ändert. Der Thread hat eine Variable vom Typ ^Variant.
Delphi-Quellcode:
Ich über gebe die Variable (z.B. ein String) als @myVar.
vWaiter.AValue := @AValue;
leider erkennt der Thread nicht, dass sich der Wert geändert hat. Der Inhalt von AValue^ (AValue vom Typ ^Variant) bleibt immer gleich, obwohl ein anderer Thread den Inhalt nachweislich geändert hat.
Delphi-Quellcode:
procedure Compare;
var vTemp: Variant; begin vTemp := AValue^; FChanged := FOldValue <> vTemp; vTemp := unassigned; end; Compare wird vom thread mit Synchronize aufgerufen um gleichzeitigen Zugriff auf die Variable zu verhindern. Was habe ich übersehen? Vielen Dank!! Toni |
Re: Threads Pointer und änderung des Speicherinhalts
Das kann nicht funktionieren, da der Wert der Variable in den Registern liegt. Und somit nicht unbedingt in den speicher gelangen muss. In C gibt es für solch einen Fall ein Schlüsselwort. In Pascal nicht.
Solche Aktionen sollte man sowieso vermeiden, da es von den verschiedenen Betriebssystemen Synchronisationsobjekte bereit gestellt werden. In diesem Fall würde ich unter Win32 ein Event empfehlen: MSDN: ![]() ![]() ![]() |
Re: Threads Pointer und änderung des Speicherinhalts
Genau das habe ich gesucht!
Ich wusste nicht, dass Win32 diese synchronisations Mechanismen bereitstellt, ich kannte das nur von C und Linux. Ich werds gleich probieren... Vielen Dank für den Hinweis! lg, Toni |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz