Цитата:
Сообщение от novashdima
Код:
procedure MyThread.Analys;
begin
.....
for i := 0 to Form1.ListBox.Count - 1 do
.....
|
Так как метод MyThread.Analys выполняется в параллельном потоке, то нельзя вот так просто (без синхронизации) обращаться к объектам основного потока. Причём в подавляющем большинстве случаев этот код и будет скорее всего работать нормально, лишь изредка вызывая неожиданные сбои.
Цитата:
Сообщение от novashdima
Потому как изначально в первых реализациях потоков у меня при нажатии на кнопку старт создавались новые потоки, поэтому это как дополнительная защита, что у меня не начнется вторая обработка одновременно.
|
Конечно же критическая секция в этом месте заблокирует выполнение другого (случайно запущенного) параллельного потока, но что при этом будет с глобальной переменной AnalysThread? Ведь после второго нажатия на кнопку запуска в этой переменной уже будет указатель на объект другого (заблокированного) параллельного потока, и первый (работающий) параллельный поток используя эту переменную будет обращаться именно к заблокированному потоку, а не к самому себе, что должно было бы быть по задумке. Поэтому когда объект хочет обратиться к своим полям, методам и свойствам, нужно использовать вовсе не глобальную переменную, а специальную переменную Self, которую, в свою очередь, можно опускать.
p.s. Что-то я тут слишком много букв написал, надеюсь понятно свою мысль изложил