Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 3 вперед Ctrl→ все |
garun Member Откуда: Оттуда Сообщений: 289 |
Есть процедура, которая работает с VCL. К этой процедуре обращается несколько потоков. Вопрос такой, нужно обязательно заключать в TThread.Synchronize() вызов самой процедуры внутри потоков или же можно заключить в TThread.Synchronize() только нужный участок кода в уже вызываемой процедуре? То есть будет ли правильно работать такой код:procedure JobVCL; begin TThread.Synchronize(nil, procedure begin // тут код работы с VCL end); end; TThread.CreateAnonymousThread(procedure begin ... JobVCL; ... end).Start; |
17 фев 21, 12:20 [22282148] Ответить | Цитировать Сообщить модератору |
Fr0sT-Brutal Member Откуда: Сообщений: 587 |
Как удобней, так и делай. Принципиальной разницы нет |
17 фев 21, 13:03 [22282202] Ответить | Цитировать Сообщить модератору |
YuRock Member Откуда: Донецк Сообщений: 4403 |
garun, Лучше вообще без синхронайз логику построить. Пусть поток независимо занимается работой, можно обновлять какие-то общие данные-результаты для отображения. А морда независимо что-то показывает. Иногда что-то берет из общих данных-результатов. |
17 фев 21, 13:04 [22282207] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6563 |
Лучше по таймеру в основном потоке проверять результаты расчетов и выводить что нужно. |
||||
17 фев 21, 13:05 [22282208] Ответить | Цитировать Сообщить модератору |
Fr0sT-Brutal Member Откуда: Сообщений: 587 |
+ Слать из рабочих потоков форме сообщения и забыть про синхронайз |
||||
17 фев 21, 13:06 [22282210] Ответить | Цитировать Сообщить модератору |
Zelius Member Откуда: Россия, Москва Сообщений: 1522 |
garun, по твоему коду правильнее так procedure JobVCL; begin // тут код работы с VCL end; TThread.CreateAnonymousThread(procedure begin ... TThread.Synchronize(JobVCL); ... end).Start; |
17 фев 21, 13:07 [22282214] Ответить | Цитировать Сообщить модератору |
garun Member Откуда: Оттуда Сообщений: 289 |
Zelius, "Правильнее" почему? Чем отличается работа моего кода от вашего? |
17 фев 21, 14:07 [22282280] Ответить | Цитировать Сообщить модератору |
ъъъъъ Member Откуда: Сообщений: 1769 |
...только треды начинают работать по очереди. |
||||
17 фев 21, 14:13 [22282285] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6563 |
ъъъъъ, Это однопоточная многопоточность. |
17 фев 21, 14:15 [22282287] Ответить | Цитировать Сообщить модератору |
ъъъъъ Member Откуда: Сообщений: 1769 |
Корпоративная. |
||||
17 фев 21, 14:29 [22282296] Ответить | Цитировать Сообщить модератору |
Zelius Member Откуда: Россия, Москва Сообщений: 1522 |
по хелпу, отличается одним вызовом и личными предпочтениями ) а так по сути тоже самое |
||||
17 фев 21, 16:13 [22282358] Ответить | Цитировать Сообщить модератору |
Fr0sT-Brutal Member Откуда: Сообщений: 587 |
У него Job в середине цикла вызывается, судя по "..." перед и после, значит, здесь все нормально |
||||||||
17 фев 21, 16:51 [22282367] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6563 |
Сообщение было отредактировано: 17 фев 21, 16:55 |
||||
17 фев 21, 17:01 [22282371] Ответить | Цитировать Сообщить модератору |
alekcvp Member Откуда: Сообщений: 2730 |
|
||||
18 фев 21, 12:22 [22282701] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6563 |
alekcvp, А теперь представь что это Queue вызывается допустим N раз в секунду, а юзер открыл какой-то диалог и ушел. Вопрос 1: Что будет, если юзер закроет диалог весьма не скоро, а в очереди накопится огромное кол-во вызовов синхронизированной процедуры? Вопрос 2: Через сколько времени в ОС кончатся ресурсы и все упадет, если юзер так и не закроет диалог? Сообщение было отредактировано: 18 фев 21, 13:13 |
18 фев 21, 13:18 [22282758] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 12572 |
Модальное окно не блокирует обработку Queue/Synchoronize |
||||
18 фев 21, 13:45 [22282784] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6563 |
Но тогда выбери сам любую другую причину длительной занятости главного потока. |
||||
18 фев 21, 14:10 [22282808] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 12572 |
|
||||
18 фев 21, 14:25 [22282823] Ответить | Цитировать Сообщить модератору |
YuRock Member Откуда: Донецк Сообщений: 4403 |
|
||||||||
18 фев 21, 14:26 [22282825] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 12572 |
|
||||
18 фев 21, 14:33 [22282833] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6563 |
_Vasilisk_, Если инициатор обновлений гуя сам главный поток, а результаты расчета другие потоки обновляют в промежуточном контейнере (в куче) - то не будет. Сообщение было отредактировано: 18 фев 21, 14:44 |
18 фев 21, 14:47 [22282848] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 12572 |
Я знаю решение: в главном потоке вместо GetMessage использовать MsgWaitForMultipleObjects, а из вычислителя дергать SetEvent. Но в VCL такое не прикрутишь |
||||
18 фев 21, 15:00 [22282870] Ответить | Цитировать Сообщить модератору |
alekcvp Member Откуда: Сообщений: 2730 |
Сообщение было отредактировано: 18 фев 21, 14:54 |
||||
18 фев 21, 15:00 [22282871] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6563 |
_Vasilisk_, Да. По таймеру в процессе расчетов. Имхо так надежней и безопасней чем через sendmessage. Ну и это кроссплатформенно, как бонус. Сообщение было отредактировано: 18 фев 21, 14:56 |
18 фев 21, 15:01 [22282872] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 12572 |
|
||||
18 фев 21, 15:04 [22282879] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 3 вперед Ctrl→ все |
Все форумы / Delphi | ![]() |