wadman писал(а):Alex2013 писал(а):Ну и как тут событие обработать ? ВНУТРИ обработчика CheckBoxChange .... Ага !
Внутри обработчика нужно запустить поток, а в обработчике, который ловит окончание работы потока - остальное.
Гениально!

Вот только у меня часть данных "гарантированно локальные" (актуальны в рамках
одного кадра и более того существуют и доступны только в конкретной части "конвейера " )...
Обработчик включения/выключения функции может блокировать или разблокировать часть настроек но запускать поток можно только
изнутрии "конвейера" ...
Просто дело в том, что программа у меня и без использования TThread далеко
не одномерная многое исполняется параллельно или как минимум
пытается работать с данными в "условно реальном времени" .
Так что "одно-поточная линейная" или даже "двухмерная" логика управления событиями там не очень проходит ...
(Это я в своем квазиз-векторном редакторе мог быть точно уверен , что основные данные доступны ВСЕ время и любой "левый" обработчик (например обработчик операции undo/redo) в
любой момент получит нужные данные и сумеет их верно обработать и выдать результат не опасаясь попасть "не в свое время" )
А поток добавляет еще одно "измерение" .
Ага, как там ? "ты все еще не умеешь думать в четырех измерениях! "
Я тоже не умею...

но хотя-бы попытаться можно !
Добавлено спустя 47 минут 25 секунд:olegy123 писал(а):Alex2013 писал(а):1 Мне тоже не нравится способ ожидания завершения через "тупой while" даже с ProcessMessages для профилактики дедлока..
ProcessMessages создан для того чтобы в главном потоке, когда он выполняет тяжелую пользовательскую, как правило в цикле, задачу можно было оживить оконное приложение - чтобы прорисовал счетчик или показал уровень загрузки.
Для обычного пользователя, который не знает что такое TThread..
Знать то знают многие, но обычно использование TThread это как "глушение рыбы атомной бомбой" ...
Alex2013 писал(а):3 Использование PostMessage разумеется хорошая идея (Можно будет прорисовку результата поиска вызвать )
У меня было реализована подгрузка данных из базы данных в отдельном потоке. При этом пользователь спокойно мог работать с формой. Когда поток загрузил данные - послал на форму PostMessage - загрузка произведена - нужно обновить контрол.
Тем самым я избавился от синхронизации(мьютекс - блокировок) с главным потоком вообще..
Мне это метод не вполне подходит по причине попытки работать с данными в реальном времени .
Добавлено спустя 4 минуты 2 секунды:Alex2013 писал(а)://(Можно и без Suspend; но зачем оставлять бесконечно крутится даже одну проверку флага ? )
Я бы залочил TEvent-ом..
Это как ? Организовать ожидание события внутри TMyThread.Execute; ? Чем это от моего метода ожидания флага UPDATE отличается ?
Добавлено спустя 42 секунды:
Иногда нужно лочить на время.. типа если за это время ничего не произошло.. выходить с признаком TimeOut
Ну да ... это как с Terminate поток повторно не запускается ...
А мне нужен режим горячего "подхвата данных" ... Краткий алгоритм такой "Каждые N-кадров проверять : Данные готовы? -> Поток готов их принять ? -->Клонировать данные --> Запустить обработку !( UPDATE :=True ) " (А результат независимо выводится по его готовности в другой части "конвейера кадров " )
А проблема "не своевременности" есть только при ручном выключении функции поиска метки и что-бы вызывать глюк нужно было очень быстро переключать галки настроек ...
Добавлено спустя 1 час 16 минут 34 секунды:
TEvent.WaitFor(Timeout : Cardinal) -> TWaitResult=(wrSignaled, wrTimeout, wrAbandoned, wrError);
А тут если можно подробнее..
С этой частью функционала ТThread я пока не разобрался.