Jednoczesny dostęp do tablicy

0

Witam,
mam problem z pewnym programem nad którym pracuje.
Jest główny wątek w którym wykonuje pewne czynności między innymi na tablicy dynamicznej. Mam również timer, który co jakiś czas odczytuje dane z tej tablicy.

W pewnym momencie kiedy dokonuje modyfikacji tablicy w głównym wątku cały program się zawiesza nie wyrzucając żadnego błędu. Po prostu wszystko zamiera.

Czy może to być związane z tym, że zarówno główny wątek jak i timer dokonują jakiś czynności na tej samej tablicy, która się zmienia (modyfikuje ją główny wątek)?

Jak temu zapobiec? Jak zrobić żeby np. główny wątek zaczekał z modyfikacją aż timer skończy czytać?
Wystarczy po prostu zrobić jakąś flagę z boolean i po prostu modyfikować jej wartość i sprawdzać przed zmianą tablicy?
pozdrawiam!

0

Timer wykonuje wszystko w ramach głównego wątku.
Może skróć kod do kilku wierszy i pokaż o co ci chodzi.

0

Ciężko będzie skrócić ale ogólnie to wygląda tak:

mam planszę na której znajduje się klocek. Użytkownik po kliknięciu na jakąś część pola wskazuje gdzie powinien znaleźć się klocek. Program oblicza najkrótszą drogę do tego miejsca i wrzuca trasę w tablicę z której korzysta timer.

W timerze program pobiera pierwszą pozycję, przesuwa klocek i kasuje z tablicy tą pozycję. Następnie pobiera kolejną pozycję i przesuwa dalej klocek i znowu kasuje itd. aż do punktu docelowego.

Wszystko jest ok kiedy klikam na planszy powoli kiedy klocek skończy ruch bądź nie robię tego często. Problem pojawia się w momencie kiedy zaczynam klikać dość intensywnie wtedy zauważyłem, że pojawiają się dziury w tablicy i program się rozkracza.

Przypuszczam, że trzeba będzie jakoś zabezpieczyć tablicę bądź zrobić jakąś pseudo komunikację aby te dwie czynności nie wchodziły sobie w paradę bądź informowały się o zmianach.

0

Użyj CS:=TCriticalSection.Create; tworzysz tylko raz.
Zaś zmianę oraz odczyt z tablicy obejmujesz SC.Enter; a SC.Leave;
Ale jednak lepiej przechowaj adres docelowy, zaś taimer za każdym razem znowu wyliczą tą tablicę ale tylko do pierwszego kroku i robi ten krok.

0

Pokaż kod pod tym przyciskiem bo to nie powinno mieć miejsca. No chyba, że masz jeszcze inne timery/wątki o których nie wspomniałeś. Pokaż też kod, w którym usuwasz zbędne elementy (choć ja bym kasował tablice jak już wykona wszystkie ruchy). Aha no i przed kolejnym wyznaczeniem trasy czekasz aż klocek dojdzie do celu czy dokładasz w takiej sytuacji do tablicy kolejne ruchy?

1 użytkowników online, w tym zalogowanych: 0, gości: 1