Siema,
Podczas korzystania z wątków natrafiłem na pewien problem:
Utworzyłem klase dziedziczącą z TThread o nazwie TBase.
Zawiera ona konstruktor
Create(const SuspOnStart: boolean;
var Map: PTMatrix);
,gdzie PTMatrix jest typem wskaźnikowym wskazującym na niepustą macierz.
W ciele konstruktora zawarte są następujące intrukcje
inherited create(SuspOnStar);
PMap := @Map
PMap pobiera adres Map bez problemów.
TPlay jest wątkiem dziedziczącym z TBase.
Definicja konstruktora wygląda następująco:
constructor TPlay.Create(var PMap: PTMatrix;
const Cell: TCell;
const Pos: TCurrentPos);
(Zmienna PMap-j.w. , pozostałe zmienne są nieistotne)
, wraz z jego ciałem:
inherited Create(false, PMap);
SetBaseCell(Cell);
SetPos(Pos, Pos);
wywołanie konstruktora następuje poprawnie.
Problem(EAccesViolation) pojawia się podczas korzystania z Macierzy.
Dla przykładu podaję fragment metody
SetPos(const Pos, OldPos: TCurrentPos);
PrevGround := PMap^[OldPos.Col, OldPos.Row];
typ danych PrevGround oraz TMatrix[i,j]](od którego powstał typ PTMatrix)
jest całkowicie zgodny.
Zmienna przekazywana przez parametr jest zadeklarowana w module głownym
jest typu PTMatrix, jest utworzona funkcją New(); ilosc elementów jest zgodna
zarówno jak ich indeksy.
Przeniosłem zmienną
var PMap: PTMatrix;
do innej procedury(jako parametr) lecz efekt działania wątku był ten sam.
(zaznaczam, wróciłem do początkowych ustawień)