Показать сообщение отдельно
  #37  
Старый 20.03.2014, 04:46
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

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

Цитата:
Сообщение от novashdima
Потому как изначально в первых реализациях потоков у меня при нажатии на кнопку старт создавались новые потоки, поэтому это как дополнительная защита, что у меня не начнется вторая обработка одновременно.
Конечно же критическая секция в этом месте заблокирует выполнение другого (случайно запущенного) параллельного потока, но что при этом будет с глобальной переменной AnalysThread? Ведь после второго нажатия на кнопку запуска в этой переменной уже будет указатель на объект другого (заблокированного) параллельного потока, и первый (работающий) параллельный поток используя эту переменную будет обращаться именно к заблокированному потоку, а не к самому себе, что должно было бы быть по задумке. Поэтому когда объект хочет обратиться к своим полям, методам и свойствам, нужно использовать вовсе не глобальную переменную, а специальную переменную Self, которую, в свою очередь, можно опускать.

p.s. Что-то я тут слишком много букв написал, надеюсь понятно свою мысль изложил
Ответить с цитированием