AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Probleme mit gleichzeitigem Zugriff auf Variablen

Ein Thema von I love Delphi · begonnen am 7. Sep 2010 · letzter Beitrag vom 8. Sep 2010
Antwort Antwort
I love Delphi

Registriert seit: 6. Nov 2007
68 Beiträge
 
#1

Probleme mit gleichzeitigem Zugriff auf Variablen

  Alt 7. Sep 2010, 19:07
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.
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.527 Beiträge
 
Delphi 7 Professional
 
#2

AW: Probleme mit gleichzeitigem Zugriff auf Variablen

  Alt 7. Sep 2010, 19:10
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
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
911 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Probleme mit gleichzeitigem Zugriff auf Variablen

  Alt 7. Sep 2010, 19:42
Das wäre ja auch nochmal 'ne Idee für XE2. Ein lock-Statement wie in C#
Code:
lock (Variable)
{
  ...
}
Delphi-Quellcode:
lock Variable during
begin
  ...
end;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
35.770 Beiträge
 
Delphi XE6 Professional
 
#4

AW: Probleme mit gleichzeitigem Zugriff auf Variablen

  Alt 7. Sep 2010, 22:45
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
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo
Online

Registriert seit: 5. Jan 2005
Ort: Stadthagen
6.309 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Probleme mit gleichzeitigem Zugriff auf Variablen

  Alt 8. Sep 2010, 00:11
öh, wozu gibt es denn Delphi-Referenz durchsuchenTCriticalSection
Kaum macht man's richtig - schon funktioniert's
Nachdenkliche Menschen denken oft warum sie nicht schon vorher daran gedacht haben.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
27.813 Beiträge
 
Delphi XE3 Professional
 
#6

AW: Probleme mit gleichzeitigem Zugriff auf Variablen

  Alt 8. Sep 2010, 06:48
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.

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
35.141 Beiträge
 
Delphi 2006 Professional
 
#7

AW: Probleme mit gleichzeitigem Zugriff auf Variablen

  Alt 8. Sep 2010, 07:55
Wird hier überhaupt mit Threads gearbeitet? Im ersten Beitrag steht nichts davon. Und heißt gleichzeitig eventuell gemeinsam?
Michael
"Every language has an optimization operator. In Delphi that operator is: //"
  Mit Zitat antworten Zitat
I love Delphi

Registriert seit: 6. Nov 2007
68 Beiträge
 
#8

AW: Probleme mit gleichzeitigem Zugriff auf Variablen

  Alt 8. Sep 2010, 22:26
Hallo,
zuerst mal die gute Nachricht: Ich habe nun die TMREW-Klasse verwendet -> Problem gelöst !

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?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
35.141 Beiträge
 
Delphi 2006 Professional
 
#9

AW: Probleme mit gleichzeitigem Zugriff auf Variablen

  Alt 8. Sep 2010, 23:06
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.
Michael
"Every language has an optimization operator. In Delphi that operator is: //"
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2014 by Daniel R. Wolf