Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Probleme mit gleichzeitigem Zugriff auf Variablen (https://www.delphipraxis.net/154348-probleme-mit-gleichzeitigem-zugriff-auf-variablen.html)

I love Delphi 7. Sep 2010 19:07


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.

rollstuhlfahrer 7. Sep 2010 19:10

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

implementation 7. Sep 2010 19:42

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;

mkinzler 7. Sep 2010 22:45

AW: Probleme mit gleichzeitigem Zugriff auf Variablen
 
http://blogs.embarcadero.com/abauer/2008/02/19/38856

In XE neue Klasse TMutex und die Möglichkeit Events zwischen Thread auszutauschen

http://docwiki.embarcadero.com/RADSt...Changes_for_XE

Sir Rufo 8. Sep 2010 00:11

AW: Probleme mit gleichzeitigem Zugriff auf Variablen
 
öh, wozu gibt es denn Delphi-Referenz durchsuchenTCriticalSection

himitsu 8. Sep 2010 06:48

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 + MSDN-Library durchsuchenEnterCriticalSection
Delphi-CL (SyncObjs) > Delphi-Referenz durchsuchenTCriticalSection
Delphi-CL (SysUtils) > Delphi-Referenz durchsuchenTSimpleRWSync
Delphi-CL (SysUtils) > Delphi-Referenz durchsuchenTMultiReadExclusiveWriteSynchronizer

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 ... Delphi-Referenz durchsuchenTMREWSync.

Luckie 8. Sep 2010 07:55

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?

I love Delphi 8. Sep 2010 22:26

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?

Luckie 8. Sep 2010 23:06

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 20:50 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