Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Thread - EnterCriticalSection - Zugriffsverletung - Warum? (https://www.delphipraxis.net/137153-thread-entercriticalsection-zugriffsverletung-warum.html)

Pilloker 15. Jul 2009 09:30


Thread - EnterCriticalSection - Zugriffsverletung - Warum?
 
Hallo,

ich habe mehrere Threads, die auf die geiche Ressource (Füllen eines Arrays) zugreifen sollen.
Darum habe ich, so wie es in Luckies Tutorial beschrieben ist, diesen Bereich in eine Kritische Sektion geklammert.

Delphi-Quellcode:
var
   KritSek: RTL_CRITICAL_SECTION;
begin
[...]
   EnterCriticalSection(KritSek);

   [...]
   //Fülle das Array
   [...]

   LeaveCriticalSection(KritSek);
[...]
end;
Sofort beim Aufruf von EnterCriticalSection erhalte ich eine Zugriffsverletzung. Weiter debuggen ist an der Stelle leider nicht möglich, da die Methode ja in einer DLL steckt.

Daher meine Frage: Hatte jemand von Euch soetwas schonmal, und wie kann das zustande kommen?

Danke im Voraus.

himitsu 15. Jul 2009 09:33

Re: Thread - EnterCriticalSection - Zugriffsverletung - Waru
 
Vielleicht solltes du dir das Beispiel nochmal ansehen und nach InitializeCriticalSection ausschau halten, sowie nach DeleteCriticalSection? :angel2:


Zitat:

Zitat von Pilloker
Weiter debuggen ist an der Stelle leider nicht möglich, da die Methode ja in einer DLL steckt.

wieso nicht?
du kannst ja von Seiten der DLL und auch von Seiten der EXE aus debuggen.

Pilloker 15. Jul 2009 09:40

Re: Thread - EnterCriticalSection - Zugriffsverletung - Waru
 
Zitat:

Zitat von himitsu
Vielleicht solltes du dir das Beispiel nochmal ansehen und nach InitializeCriticalSection ausschau halten, sowie nach DeleteCriticalSection? :angel2:

Ach herrchechen :oops:
Das kommt davon, wenn man nur soviel liest, wie man meint, zu benötigen...

Danke Dir; jetzt funktioniert es natürlich :)

Zitat:

Zitat von himitsu
Zitat:

Zitat von Pilloker
Weiter debuggen ist an der Stelle leider nicht möglich, da die Methode ja in einer DLL steckt.

wieso nicht?
du kannst ja von Seiten der DLL und auch von Seiten der EXE aus debuggen.

So meinte ich das nicht. Ich meinte, dass der Rumpf von 'EnterCriticalSection' in der kernel32.dll steckt, und ich da nicht weiter debuggen kann.

Bbommel 15. Jul 2009 09:43

Re: Thread - EnterCriticalSection - Zugriffsverletung - Waru
 
@Piloker: Du musst die CriticalSection ja auch irgendwo initialisieren und später wieder freigeben. Machst du das schon irgendwo?

Ansonsten: Ich hatte mir damals auch Luckies Tutorial durchgelesen, um einen Einstieg in die Threads zu finden (Danke dafür!), aber als Abweichung dazu nutze ich nicht RTL_CRITICAL_SECTION, sondern bin auf die von Delphi angebotenen TCriticalSection umgestiegen. Ist im Umgang vielleicht etwas vertrauter.

Im Quellcode muss die dann an der passenden Stelle initialisiert werden:
Delphi-Quellcode:
myCriticalSection:=TCriticalSection.Create;
Die Benutzung sieht dann so aus:
Delphi-Quellcode:
myCriticalSection.Acquire;
// ...
// mach was kritisches
// ...
myCriticalSection.Release;
Und wenn man sie nicht mehr braucht, kann man sie wieder entsorgen:
Delphi-Quellcode:
myCriticalSection.Free;
Wie gesagt, fand ich von der Handhabung her etwas vertrauter. Und hilft vielleicht, sauber angewandt, auch das Problem zu lösen. :)

Bis denn
Bommel

Pilloker 15. Jul 2009 10:33

Re: Thread - EnterCriticalSection - Zugriffsverletung - Waru
 
Hallo Bommel,

auch für Deinen Beitrag vielen Dank :)

peschai 15. Jul 2009 11:27

Re: Thread - EnterCriticalSection - Zugriffsverletung - Waru
 
Hallo

Ich habe es mir angewöhnt IMMER alle lokalen variablen zu initialisieren, egal ob notwendig oder nicht...

Delphi-Quellcode:
begin
  FillChar(KritSek,SizeOf(KritSek),0);
  ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:01 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