|
|
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
Есть процедура, которая работает с VCL. К этой процедуре обращается несколько потоков. Вопрос такой, нужно обязательно заключать в TThread.Synchronize() вызов самой процедуры внутри потоков или же можно заключить в TThread.Synchronize() только нужный участок кода в уже вызываемой процедуре? То есть будет ли правильно работать такой код: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2021, 12:20 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
Как удобней, так и делай. Принципиальной разницы нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2021, 13:03 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
garun, Лучше вообще без синхронайз логику построить. Пусть поток независимо занимается работой, можно обновлять какие-то общие данные-результаты для отображения. А морда независимо что-то показывает. Иногда что-то берет из общих данных-результатов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2021, 13:04 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
YuRock garun, Лучше вообще без синхронайз логику построить. Пусть поток независимо занимается работой, можно обновлять какие-то общие данные-результаты для отображения. А морда независимо что-то показывает. Иногда что-то берет из общих данных-результатов. Лучше по таймеру в основном потоке проверять результаты расчетов и выводить что нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2021, 13:05 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
YuRock garun, Лучше вообще без синхронайз логику построить. Пусть поток независимо занимается работой, можно обновлять какие-то общие данные-результаты для отображения. А морда независимо что-то показывает. Иногда что-то берет из общих данных-результатов. + Слать из рабочих потоков форме сообщения и забыть про синхронайз ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2021, 13:06 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
garun, по твоему коду правильнее так Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2021, 13:07 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
Zelius, "Правильнее" почему? Чем отличается работа моего кода от вашего? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2021, 14:07 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
Fr0sT-Brutal Как удобней, так и делай. Принципиальной разницы нет ...только треды начинают работать по очереди. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2021, 14:13 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
ъъъъъ, Это однопоточная многопоточность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2021, 14:15 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
rgreat ъъъъъ, Это однопоточная многопоточность. Корпоративная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2021, 14:29 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
garun "Правильнее" почему? Чем отличается работа моего кода от вашего? по хелпу , отличается одним вызовом и личными предпочтениями ) а так по сути тоже самое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2021, 16:13 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
ъъъъъ Fr0sT-Brutal Как удобней, так и делай. Принципиальной разницы нет ...только треды начинают работать по очереди. У него Job в середине цикла вызывается, судя по "..." перед и после, значит, здесь все нормально ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2021, 16:51 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
Fr0sT-Brutal У него Job в середине цикла вызывается, судя по "..." перед и после, значит, здесь все нормально ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2021, 17:01 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
rgreat Особенно все будет "нормально" если основной поток висит где-нибудь на каком-нибудь ShowMessage или ином диалог боксе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2021, 12:22 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
alekcvp, А теперь представь что это Queue вызывается допустим N раз в секунду, а юзер открыл какой-то диалог и ушел. Вопрос 1: Что будет, если юзер закроет диалог весьма не скоро, а в очереди накопится огромное кол-во вызовов синхронизированной процедуры? Вопрос 2: Через сколько времени в ОС кончатся ресурсы и все упадет, если юзер так и не закроет диалог? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2021, 13:18 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
rgreat А теперь представь что это Queue вызывается допустим N раз в секунду, а юзер открыл какой-то диалог и ушел. Модальное окно не блокирует обработку Queue/Synchoronize ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2021, 13:45 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Модальное окно не блокирует обработку Queue/Synchoronize Но тогда выбери сам любую другую причину длительной занятости главного потока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2021, 14:10 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
rgreat Но тогда выбери сам любую другую причину длительной занятости главного потока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2021, 14:25 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ rgreat А теперь представь что это Queue вызывается допустим N раз в секунду, а юзер открыл какой-то диалог и ушел. Модальное окно не блокирует обработку Queue/Synchoronize ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2021, 14:26 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
YuRock Даже если это модальное окно вызвалось из Queue/Synchoronize? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2021, 14:33 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Если инициатор обновлений гуя сам главный поток, а результаты расчета другие потоки обновляют в промежуточном контейнере (в куче) - то не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2021, 14:47 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
rgreat Если инициатор обновлений гуя сам главный поток, Я знаю решение: в главном потоке вместо GetMessage использовать MsgWaitForMultipleObjects, а из вычислителя дергать SetEvent. Но в VCL такое не прикрутишь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2021, 15:00 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
rgreat alekcvp, А теперь представь что это Queue вызывается допустим N раз в секунду, а юзер открыл какой-то диалог и ушел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2021, 15:00 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Да. По таймеру в процессе расчетов. Имхо так надежней и безопасней чем через sendmessage. Ну и это кроссплатформенно, как бонус. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2021, 15:01 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
rgreat Ну и это кроссплатформенно, как бонус. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2021, 15:04 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Но не sendmessage. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2021, 15:10 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ YuRock Даже если это модальное окно вызвалось из Queue/Synchoronize? Первая процедура, вызванная в synchronize, еще не завершилась, а уже запустилась другая. Это грозит крахом логики. Впрочем, с обычными сообщениями - те же проблемы возможны. Я просто думал, что там реальная очередь выполнений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2021, 15:45 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
YuRockПервая процедура, вызванная в synchronize, еще не завершилась, а уже запустилась другая. А ты всерьёз полагал, что Synchronize в двух разных потоках обязаны синхронизироваться не только с главным потоком, но и между собой? Да, это полный крах логики. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2021, 15:47 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
alekcvp А что будет, если поток посылает SendNotifyMessage(), а юзер открыл APPL_MODAL сообщение и ушел?.. А ничего на самом деле. Окно висит, сообщения обрабатываются ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2021, 15:49 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
rgreat, Если бы у меня зависал главный поток, то я бы делал синхронизацию через промежуточный поток Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Хотя на реальном проекте у меня сделано так Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2021, 15:52 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov YuRockПервая процедура, вызванная в synchronize, еще не завершилась, а уже запустилась другая. А ты всерьёз полагал, что Synchronize в двух разных потоках обязаны синхронизироваться не только с главным потоком, но и между собой? Да, это полный крах логики.Я, честно говоря, его использовал полтора раза в жизни. Но была мысль, да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2021, 16:12 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, И зачем так все усложнять... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2021, 16:35 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov YuRockПервая процедура, вызванная в synchronize, еще не завершилась, а уже запустилась другая. А ты всерьёз полагал, что Synchronize в двух разных потоках обязаны синхронизироваться не только с главным потоком, но и между собой? Да, это полный крах логики. А как они могут выполняться параллельно в одном потоке ? Квантовая однопоточность что-ли? Типа выполняется один поток, но неизвестно какой? 😁 Разумеется, при условии что первый Synchronize не вызывает ProcessMessages(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2021, 17:14 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
alekcvpА как они могут выполняться параллельно *в одном потоке*? Рекурсивно. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2021, 17:43 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
rgreat И зачем так все усложнять... alekcvp Разумеется, при условии что первый Synchronize не вызывает ProcessMessages(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2021, 18:18 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Чтобы не лепить костыли в виде таймера Я бы сказал что твой вариант мне кажется более костыльным. Да и без таймера в обработке GUI на длительных задачах чаще всего все равно не обойтись. По таймеру можно делать плавную анимацию прогресса даже если сами итерации в расчетном потоке редки или неравномерны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2021, 18:30 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Чтобы не лепить костыли в виде таймера ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2021, 02:11 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
white_nigger _Vasilisk_ Чтобы не лепить костыли в виде таймера GUI должен заниматься GUI, расчётчик должен расчитывать - как ни парадоксально звучит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2021, 08:28 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) в чём костыль то? GUI должен заниматься GUI, расчётчик должен расчитывать - как ни парадоксально звучит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2021, 16:06 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
white_niggerПоток сам знает когда и что надо отобразить при изменении своего состояния Отображать прогресс на каждую итерацию цикла - самый надёжный способ получить невыносимые тормоза. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2021, 16:13 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
white_nigger Нехрена из GUI лезть в работающий поток. Поток должен складывать результат своей работы в специальный контейнер в который есть доступ у GUI потока. В таком случае потоки работают независимо друг от друга и друг другу не мешают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2021, 16:42 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
rgreat, поддерживаю. потоку входные данные где-то отдали и оставили его в покое. поток считает. если есть необходимость продвигает прогресс через какой-то синхронный код (лучше, конечно, не за одну итерацию, но тут всяко бывает. бывает что итерации долгие) когда досчитал результат, сложил куда-то в переменную и сказал гую что готово. всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2021, 19:15 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
makhaon если есть необходимость продвигает прогресс через какой-то синхронный код А я обычно использую контейнер с доступом к нему через обычную TCriticalSection. При этом более важный поток заходит туда через .Enter a менее важный через TryEnter. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2021, 19:23 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov Отображать прогресс на каждую итерацию цикла - самый надёжный способ получить невыносимые тормоза. rgreat При этом более важный поток заходит туда через .Enter a менее важный через TryEnter. Thread1 (GUI)Thread2 (Calc)OnTimerTryLockRead (-1)Lock (Wait)Unlock LockedWrite (0)UnlockOnTimerTryLockRead (0)Lock (Wait)Unlock LockedWrite (1)Unlockну подумаешь, случайно совпал интервал таймера и вычислений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2021, 20:17 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov Отображать прогресс на каждую итерацию цикла - самый надёжный способ получить невыносимые тормоза. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2021, 20:34 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Что у тебя в таблице за цифры? Не понятно что не так. Чего страшного от того что забор данных может изредка совпасть с сохранением результата расчета? Либо GUI тред в этот раз не отработает, либо Calc тред совсем немного подождет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2021, 23:19 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
rgreat _Vasilisk_, Что у тебя в таблице за цифры? Не понятно что не так. Чего страшного от того что забор данных может изредка совпасть с сохранением результата расчета? Либо GUI тред в этот раз не отработает, либо Calc тред совсем немного подождет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2021, 02:26 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
YuRock, Вообще, в нормально написанном ПО время сохранения данных в "экспортный" контейнер должно составлять исчезающе малую честь времени в сравнении с периодом цикла таймера GUI и цикла таймера Calc потока. Так что вероятность постоянного пропуска цикла должна быть порядка уровня шанса внезапного взрыва сверхновой на солнце. Если боязно можно обойтись и без TryEnter, но тогда стоит написать код так что бы запись и чтение из контейнера занимали около нуля микросекунд. Т.е. Lock, Assign, Unlock. Ну или вообще TInterlocked.Exchange без всяких критических секций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2021, 03:19 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
Ну и собственно если GUI поток обновляет данные раз в секунду а Calc поток раз в минуту то максимально теоретически возможно пропустить только одно из 60 обновлений GUI. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2021, 03:33 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
rgreat Если боязно можно обойтись и без TryEnter, но тогда стоит написать код так что бы запись и чтение из контейнера занимали около нуля микросекунд. Т.е. Lock, Assign, Unlock. Один поток пишет иногда какую-нибудь сотню байт, gui - читает эти байты раз в секунду. Даже если произойдет блокировка - она продлится в районе 0-16 мс. В любом случае времени это займет столько. Нисколько, короче. При этом будет гарантия обновления экрана. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2021, 03:55 |
|
||
|
Работа с потоками. Вопрос по синхронизации
|
|||
|---|---|---|---|
|
#18+
YuRock, Честно сказать я сам себя запутал, ибо TryEnter предполагался на случай ленивого варианта когда передаточного контейнера вообще нет и расчетный поток постоянно работает в фоне с редкими включениями на перерасчет, а GUI поток читает результат прямо из переменных расчетного потока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2021, 04:11 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2037599]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
201ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 234ms |
| total: | 524ms |

| 0 / 0 |
