![]() |
Probleme mit gleichzeitigem Zugriff auf Variablen
Hallo liebe DPler,
wie schon öfters erwähnt arbeite ich an einem Spiel mit Hilfe der Grafik-Engine Andorra 2d. Nun treten in letzter Zeit aber immer mehr Fehler auf (EAcessViolation ...), die ich nicht erklären kann. Meine letzte Hoffnung (aber auch Vermutung) ist folgende: Die Paint-Methoden der Engine werden im OnIdle() aufgerufen, jedoch nur wenn "Pause = false" ist. Nun kann ich jedoch zu jeder Zeit auf den Pause-Knopf drücken und "Pause" wird auf "true" gesetzt. Ich schätze mal, dass genau auf diesem Wege dann meine Fehler zustande kommen. Kann das sein? Ich habe bezüglich Synchronisierung von Variablen keinerlei Ahnung... Wenn dem so wäre, wüste dann jemand eine Lösung? Ich würde mich riesig freuen wenn sich diese lästigen Fehlermeldungen endlich erledigt haben würden. Viele Grüße, I love Delphi! P.S.: Ich hoffe ich habe jetzt das richtige Unterforum erwischt, dachte es passt ganz gut. |
AW: Probleme mit gleichzeitigem Zugriff auf Variablen
Also auf eine Variable mehrfach gleichzeitig zuzugreifen ist keine gute Idee. Gleichzeitig zu schreiben noch weniger. Du könntest jetzt eine Prozedur schreiben, welche mit Hilfe einer Semaphore verhindert, dass mehr als 1 Lese/Schreibzugriff auf einmal passiert.
Bernhard |
AW: Probleme mit gleichzeitigem Zugriff auf Variablen
Das wäre ja auch nochmal 'ne Idee für XE2. Ein lock-Statement wie in C# :lol:
Code:
lock (Variable)
{ ... }
Delphi-Quellcode:
lock Variable during
begin ... end; |
AW: Probleme mit gleichzeitigem Zugriff auf Variablen
![]() In XE neue Klasse TMutex und die Möglichkeit Events zwischen Thread auszutauschen ![]() |
AW: Probleme mit gleichzeitigem Zugriff auf Variablen
öh, wozu gibt es denn
![]() |
AW: Probleme mit gleichzeitigem Zugriff auf Variablen
Gleichzeitig lesend ist oftmals kein Problem (kommt aber auf die Variabel an, denn gleichzeitig einen Stream nutzen ist keine gute Idee).
Sobald man aber gleichzeitig Schreibend oder Schreibend+Lesend zugreifen will, müßte man sowieso absichern. WinAPI > TRTLCriticalSection/RTL_CRITICAL_SECTION + ![]() Delphi-CL (SyncObjs) > ![]() Delphi-CL (SysUtils) > ![]() Delphi-CL (SysUtils) > ![]() TSimpleRWSync kann man eigentlich vergessen, da es eigentlich nur eine CriticalSection enthält, aber falls man wenigstens seinen Code aufräumen will und Schreib-/Lesevorgänge entsprechende kennzeichnen will, dann ... nja, dann kann man es doch schonmal nutzen. :angel: TMultiReadExclusiveWriteSynchronizer sollte vorallem Vorteile besitzen, wenn man sehr oft lesend zugreift und nur selten schreibend. > Mehrere gleichzeitige Lesevorgänge werden erlaubt und bei einem Schreibzugriff wird alles geblockt. > Aber dieses sollte man natürlich nur nutzen, wenn gleichzeitige Lesevorgänge kein Problem darstellen. Und falls man ein bissl schreibfaul ist oder sich TMultiReadExclusiveWriteSynchronizer nicht merken kann ... ![]() |
AW: Probleme mit gleichzeitigem Zugriff auf Variablen
Wird hier überhaupt mit Threads gearbeitet? Im ersten Beitrag steht nichts davon. Und heißt gleichzeitig eventuell gemeinsam?
|
AW: Probleme mit gleichzeitigem Zugriff auf Variablen
Hallo,
zuerst mal die gute Nachricht: Ich habe nun die TMREW-Klasse verwendet -> Problem gelöst :-D! Vielen Dank also an Euch; Ihr seid echt spitze! Viele Grüße, I Love Delphi P.S.: Nur nochmal so am Rande: Eigentlich dachte ich nicht das OnIdle() als eigener Thread arbeitet, da das Problem aber offensichtlich am gleichzeitigem Zugriff lag, muss es sich wohl um einen extra Thread handeln, oder? |
AW: Probleme mit gleichzeitigem Zugriff auf Variablen
Nein. OnIdle wird nur ausgelöst, wenn keine anderen Nachrichten zu verarbeiten sind. Da wird kein separater Thread erzeugt. Ich gehe mal davon aus, dass mit unnötigen globalen Variablen gearbeitet wurde.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:37 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-2025 by Thomas Breitkreuz