![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с потоками [D6, Win95/98, WinXP]
Izyum © (2004-10-14 16:18:00)Возникла задача создать многопоточное приложение...
Вторичный поток должен выполнять определенную работу и отображать результаты индикаторами на главной форме...
Но в момент, когда я беру мышом заголовок главной формы - вторичный поток тоже останавливается...
тот же эффект наблюдается в демке из стандартной поставки...
ВОПРОС: это так и должно быть или есть способ создать вторичный поток, который работает абсолютно независимо от главного?
panov (2004-10-14 17:32:00) [21]>Izyum © (14.10.04 17:28) [6]
Так не надо на каждый шаг выполнять обновление формы или визуальных объектов VCL.
В конце-концов, если такая необходимость есть, используй синхронизацию методом посылки сообщений из доп. потока в основной и обрабатывай их.
В этом случае доп. поток не будет ожидать обновления.
Izyum (2004-10-14 17:28:00) [22]Ага, хоть что-то проясняется...
Тогда может кто-то подскажет как реализовать такую задачу:
во вторичном потоке необходимо ГАРАНТИРОВАНО считывать данные из какого-либо порта (давайте для примера возьмем COM)и по возможности отображать результаты на главной форме. Если, к примеру, пользователь выполняет какие-либо действия над главной формой, которые не дают выполнится Synchronize - пусть интерфейс не обновляется, но данные из порта должны быть вычитаны все равно. реально как-то это реализовать?
Григорьев Антон (2004-10-14 17:21:00) [23]В это время не работает Synchronize, т.к. он выполняется в главной нити, а главная нить занята обработкой перемещения формы. Если бы не было Synchronize, нить спокойно продолжала бы свою работу.
Izyum (2004-10-14 16:30:00) [24]Значит не полностью понятно объяснил...
Если на главной форме ничего не меняется из-за того, что я держу заголовок мышью - во вторичном потоке inc(i) должно работать?
Если нет - по чему?
Если да - не работает!
Дело в том, что за 10 секунд код inc(i) должен был достаточно много "накрутить". Правильно? Икогда я отпустил заголовок - обновления заголовка должно быб продолжиться с текущего значения i. Правильно? Так вот если при значении 1000 я нажал мыша, подержал 10 секунд и отпустил - в заголовке побежало начиная с 1001... Хотя я ожидал там увидеть, к примеру, 2001...
Суслик (2004-10-14 16:26:00) [25]
> Во вторичном потоке делаю тупое наращивание переменной
> и вывожу ее значение в заголовок гланой формы...
Но это не значит, что поток остановился. Дело в том, что vcl принципиально онднозадачаная - только один поток может менять что-то в формах!
Читай и изучай метод tthread.synchronize
Izyum (2004-10-14 16:22:00) [26]Во вторичном потоке делаю тупое наращивание переменной и вывожу ее значение в заголовок гланой формы...
Так вот, когда нажимаю кнопик мыша на заголовке - цифири перестают "бежать". Но если подержать секунд десять (должно уже заметно вперед продвинуться это сложное вычисление) и отпустить, цифири продолжают считать с той, на которой произошло нажатия кнопика...
ЗЫ: надеюсь понятно описал;)
Суслик (2004-10-14 16:19:00) [27]
> вторичный поток тоже останавливается...
как проверил?