Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
Топик располагается на нескольких страницах: ←Ctrl назад 1 [2] 3 вперед Ctrl→ все |
rgreat Member Откуда: Сообщений: 6563 |
_Vasilisk_, Но не sendmessage. |
18 фев 21, 15:10 [22282889] Ответить | Цитировать Сообщить модератору |
YuRock Member Откуда: Донецк Сообщений: 4404 |
Первая процедура, вызванная в synchronize, еще не завершилась, а уже запустилась другая. Это грозит крахом логики. Впрочем, с обычными сообщениями - те же проблемы возможны. Я просто думал, что там реальная очередь выполнений. |
||||||||
18 фев 21, 15:45 [22282921] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52445 |
А ты всерьёз полагал, что Synchronize в двух разных потоках обязаны синхронизироваться не только с главным потоком, но и между собой? Да, это полный крах логики. Posted via ActualForum NNTP Server 1.5 |
||
18 фев 21, 15:47 [22282923] Ответить | Цитировать Сообщить модератору |
Fr0sT-Brutal Member Откуда: Сообщений: 587 |
А ничего на самом деле. Окно висит, сообщения обрабатываются |
||||
18 фев 21, 15:49 [22282924] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 12572 |
rgreat, Если бы у меня зависал главный поток, то я бы делал синхронизацию через промежуточный поток procedure TCalcThread.Execute; begin ...... SetEvent(NotifyEvent); .... end; procedure TNotifyThread.Execute; begin while not Terminated do begin WaitForSingleObject(NotifyEvent); Synchronize(UpdateVCL) end; end;Хотя на реальном проекте у меня сделано так
|
|
18 фев 21, 15:52 [22282929] Ответить | Цитировать Сообщить модератору |
YuRock Member Откуда: Донецк Сообщений: 4404 |
Но была мысль, да. |
||||||
18 фев 21, 16:12 [22282943] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6563 |
_Vasilisk_, И зачем так все усложнять... |
18 фев 21, 16:35 [22282954] Ответить | Цитировать Сообщить модератору |
alekcvp Member Откуда: Сообщений: 2730 |
А как они могут выполняться параллельно в одном потоке? Квантовая однопоточность что-ли? Типа выполняется один поток, но неизвестно какой? 😁 Разумеется, при условии что первый Synchronize не вызывает ProcessMessages(). Сообщение было отредактировано: 18 фев 21, 17:08 |
||||||
18 фев 21, 17:14 [22282988] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52445 |
Рекурсивно. Posted via ActualForum NNTP Server 1.5 |
||
18 фев 21, 17:43 [22283003] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 12572 |
|
||||||||
18 фев 21, 18:18 [22283028] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6563 |
Я бы сказал что твой вариант мне кажется более костыльным. Да и без таймера в обработке GUI на длительных задачах чаще всего все равно не обойтись. По таймеру можно делать плавную анимацию прогресса даже если сами итерации в расчетном потоке редки или неравномерны. |
||||
18 фев 21, 18:30 [22283038] Ответить | Цитировать Сообщить модератору |
white_nigger Member Откуда: Тула Сообщений: 2469 |
|
||||
19 фев 21, 02:11 [22283220] Ответить | Цитировать Сообщить модератору |
kealon(Ruslan) Member Откуда: Нижневартовск Сообщений: 6255 |
GUI должен заниматься GUI, расчётчик должен расчитывать - как ни парадоксально звучит |
||||||||
19 фев 21, 08:28 [22283242] Ответить | Цитировать Сообщить модератору |
white_nigger Member Откуда: Тула Сообщений: 2469 |
|
||||
19 фев 21, 16:06 [22283568] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52445 |
Отображать прогресс на каждую итерацию цикла - самый надёжный способ получить невыносимые тормоза. Posted via ActualForum NNTP Server 1.5 |
||
19 фев 21, 16:13 [22283574] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6563 |
Поток должен складывать результат своей работы в специальный контейнер в который есть доступ у GUI потока. В таком случае потоки работают независимо друг от друга и друг другу не мешают. |
||||
19 фев 21, 16:42 [22283597] Ответить | Цитировать Сообщить модератору |
makhaon Member Откуда: A galaxy far far away Сообщений: 3788 |
rgreat, поддерживаю. потоку входные данные где-то отдали и оставили его в покое. поток считает. если есть необходимость продвигает прогресс через какой-то синхронный код (лучше, конечно, не за одну итерацию, но тут всяко бывает. бывает что итерации долгие) когда досчитал результат, сложил куда-то в переменную и сказал гую что готово. всё. |
19 фев 21, 19:15 [22283718] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6563 |
А я обычно использую контейнер с доступом к нему через обычную TCriticalSection. При этом более важный поток заходит туда через .Enter a менее важный через TryEnter. |
||||
19 фев 21, 19:23 [22283723] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 12572 |
|
|||||||||||||||||||||||||||||||||||
19 фев 21, 20:17 [22283759] Ответить | Цитировать Сообщить модератору |
white_nigger Member Откуда: Тула Сообщений: 2469 |
|
||||
19 фев 21, 20:34 [22283769] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6563 |
_Vasilisk_, Что у тебя в таблице за цифры? Не понятно что не так. Чего страшного от того что забор данных может изредка совпасть с сохранением результата расчета? Либо GUI тред в этот раз не отработает, либо Calc тред совсем немного подождет. Сообщение было отредактировано: 19 фев 21, 23:21 |
19 фев 21, 23:19 [22283840] Ответить | Цитировать Сообщить модератору |
YuRock Member Откуда: Донецк Сообщений: 4404 |
|
||||
20 фев 21, 02:26 [22283868] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6563 |
YuRock, Вообще, в нормально написанном ПО время сохранения данных в "экспортный" контейнер должно составлять исчезающе малую честь времени в сравнении с периодом цикла таймера GUI и цикла таймера Calc потока. Так что вероятность постоянного пропуска цикла должна быть порядка уровня шанса внезапного взрыва сверхновой на солнце. Если боязно можно обойтись и без TryEnter, но тогда стоит написать код так что бы запись и чтение из контейнера занимали около нуля микросекунд. Т.е. Lock, Assign, Unlock. Ну или вообще TInterlocked.Exchange без всяких критических секций. Сообщение было отредактировано: 20 фев 21, 03:22 |
20 фев 21, 03:19 [22283875] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6563 |
Ну и собственно если GUI поток обновляет данные раз в секунду а Calc поток раз в минуту то максимально теоретически возможно пропустить только одно из 60 обновлений GUI. |
20 фев 21, 03:33 [22283876] Ответить | Цитировать Сообщить модератору |
YuRock Member Откуда: Донецк Сообщений: 4404 |
Один поток пишет иногда какую-нибудь сотню байт, gui - читает эти байты раз в секунду. Даже если произойдет блокировка - она продлится в районе 0-16 мс. В любом случае времени это займет столько. Нисколько, короче. При этом будет гарантия обновления экрана. |
||||
20 фев 21, 03:55 [22283878] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: ←Ctrl назад 1 [2] 3 вперед Ctrl→ все |
Все форумы / Delphi | ![]() |