AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Änderungen von Variablen synchronisieren

Ein Thema von Breager · begonnen am 17. Mär 2012 · letzter Beitrag vom 20. Mär 2012
Antwort Antwort
Seite 3 von 4     123 4   
Breager

Registriert seit: 18. Feb 2012
40 Beiträge
 
#21

AW: Änderungen von Variablen synchronisieren

  Alt 19. Mär 2012, 21:53
Zitat von Sir Rufo:
Erklär doch mal, wofür du das MustLock in LockList und UnlockList jeweils veränderst. Das macht in meinen Augen keinen Sinn.
Wenn ich die CriticalSection über TMyList.Locklist starte, würde z.B. innerhalb von TMyList.Count ein erneuter Versuch, die CriticalSecion zu starten eine Ausführung des Codes in TMyList.Count blockieren.

Aus diesem Grund setze ich bei TMyList.Locklist MustLock:=False. Das bedeutet, dass ich z.B. innerhalb von Count keine CriticalSection mehr starten muss, da schon aktiv
IF MustLock then Lock Also wird der Code in Count ausgeführt.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#22

AW: Änderungen von Variablen synchronisieren

  Alt 19. Mär 2012, 22:29
Ja, sowas hatte ich mir gedacht

Aber das ist überflüssig und verkompliziert die Sache unnötig.

Eine CriticalSection sorgt dafür, das innerhalb selbiger nur ein ThreadKontext aktiv ist.
Innerhalb dieses ThreadKontextes kann eine CS aber beliebig oft betreten werden.
Die CS muss aber auch genauso oft wieder verlassen werden damit diese wieder frei für einen anderen ThreadKontext ist.
Delphi-Quellcode:
FCS.Enter;
FCS.Enter;
  TuWas;
FCS.Leave;
FCS.Leave;
Diese Konstrukt funktioniert problemlos, denn wenn die CS betreten werden kann, dann funktioniert auch das zweite Betreten.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Breager

Registriert seit: 18. Feb 2012
40 Beiträge
 
#23

AW: Änderungen von Variablen synchronisieren

  Alt 19. Mär 2012, 22:40
Alles klar Danke, man lernt eben nie aus. Das Thema Threads wird mir noch die ein oder andere schlaflose Nacht bescheren (absolutes Neuland für mich)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
39.678 Beiträge
 
Delphi 11 Alexandria
 
#24

AW: Änderungen von Variablen synchronisieren

  Alt 19. Mär 2012, 22:54
Und das Try-Finally nicht vergessen, denn die CS muß eben unbedingt genau so oft verlassen/freigegeben werden, wie sie betreten/gesperrt wurde.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Breager

Registriert seit: 18. Feb 2012
40 Beiträge
 
#25

AW: Änderungen von Variablen synchronisieren

  Alt 20. Mär 2012, 00:16
Zitat von himitsu:
Und das Try-Finally nicht vergessen, denn die CS muß eben unbedingt genau so oft verlassen/freigegeben werden, wie sie betreten/gesperrt wurde.
Ja, das habe ich jetzt konsequent in jeder Function und Procedure, wie beim Beispiel von Count, eingebaut:
Delphi-Quellcode:
Function TMyList.Count:Integer;
Begin
 lock;
 try
  Result:=MyList.Count;
 finally
  unlock;
 end;
End;
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#26

AW: Änderungen von Variablen synchronisieren

  Alt 20. Mär 2012, 06:27
Und das 'lock' bzw. 'unlock' sieht wie aus?
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.389 Beiträge
 
Delphi 10.4 Sydney
 
#27

AW: Änderungen von Variablen synchronisieren

  Alt 20. Mär 2012, 07:21
Delphi-Quellcode:
Procedure TMyList.Lock;
Begin
IF MustLock then
   FCS.Enter;
End;

procedure TMyList.Unlock;
begin
IF MustLock then
   FCS.Release;
end;


Procedure TMyList.Locklist;
Begin
 FCS.Enter;
 MustLock:=False; //Liste muss später NICHT automatisch gesperrt werden
End;

Procedure TMyList.Unlocklist; //EDIT: Reihenfolge der Codezeilen wurde getauscht
Begin
  MustLock:=True; //Liste muss später automatisch gesperrt werden
  FCS.Release;
End;
Wenn Thread1 Locklist aufgerufen hat und die Liste bearbeitet, kann Thread2 im Lock am FCS.Enter vorbei und die Liste ebenfalls zur gleichen Zeit bearbeiten.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
39.678 Beiträge
 
Delphi 11 Alexandria
 
#28

AW: Änderungen von Variablen synchronisieren

  Alt 20. Mär 2012, 07:46
Wozu das MustLock?

Erstmal das von Blup Genannte
und wenn sich zwischen Lock und Unlock das MustLock ändert, dann stimmt die Anzahl auch nicht mehr.


Im Prinzip ist das LockList/UnlockList umsonst, außerdem fehleranfällig und Lock/Unlock alleine reicht auch schon aus.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (20. Mär 2012 um 07:49 Uhr)
  Mit Zitat antworten Zitat
Breager

Registriert seit: 18. Feb 2012
40 Beiträge
 
#29

AW: Änderungen von Variablen synchronisieren

  Alt 20. Mär 2012, 17:11
Zitat von himitsu:
Im Prinzip ist das LockList/UnlockList umsonst, außerdem fehleranfällig und Lock/Unlock alleine reicht auch schon aus.
Der Gedanke dahinter war, dass ich bei Bedarf Codeabschnitte einschließen kann.
Delphi-Quellcode:
MyList.Locklist;
Dateiinfo:=Leseausdatei(MyList.Item[5].FileName); //Leseausdatei ist kein Bestandteil der Klasse
//Was passiert, wenn während der Leseausdatei Function gleichzeitig das MyList.Item[5] über MyList.Delete(5) gelöscht wird.
Mylist.Item[5].Daten:=Dateiinfo; //Daten werden in falschen Item gespeichert.
MyList.LockList;
Sir Rufo hat mich schon darauf hingewiesen, dass das Mustlock überflüssig ist.

EDIT:
Zitat von himitsu:
und wenn sich zwischen Lock und Unlock das MustLock ändert, dann stimmt die Anzahl auch nicht mehr.
Mustlock kann doch garnicht geändert werden, da Private

Geändert von Breager (20. Mär 2012 um 17:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
39.678 Beiträge
 
Delphi 11 Alexandria
 
#30

AW: Änderungen von Variablen synchronisieren

  Alt 20. Mär 2012, 17:13
Das geht ja dennoch.
Delphi-Quellcode:
MyList.Lock;
try
  Dateiinfo:=Leseausdatei(MyList.Item[5].FileName); //Leseausdatei ist kein Bestandteil der Klasse
  //Was passiert, wenn während der Leseausdatei Function gleichzeitig das MyList.Item[5] über MyList.Delete(5) gelöscht wird.
  Mylist.Item[5].Daten:=Dateiinfo; //Daten werden in falschen Item gespeichert.
finally
  MyList.Unlock;
end;
Wenn du Mustlock entfernst, wirst du bemerken, daß Lock=LickList und Unlock=UnlockList.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  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 · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf