Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Работа с потоками. Вопрос по синхронизации  [new]
rgreat
Member

Откуда:
Сообщений: 6563
_Vasilisk_,

Но не sendmessage.
18 фев 21, 15:10    [22282889]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4404
_Vasilisk_
YuRock
Даже если это модальное окно вызвалось из Queue/Synchoronize?
Ага.
Странная синхронизация получается.
Первая процедура, вызванная в synchronize, еще не завершилась, а уже запустилась другая.
Это грозит крахом логики.

Впрочем, с обычными сообщениями - те же проблемы возможны. Я просто думал, что там реальная очередь выполнений.
18 фев 21, 15:45    [22282921]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52445

YuRock
Первая процедура, вызванная в synchronize, еще не завершилась, а уже запустилась другая.

А ты всерьёз полагал, что Synchronize в двух разных потоках обязаны синхронизироваться не
только с главным потоком, но и между собой? Да, это полный крах логики.

Posted via ActualForum NNTP Server 1.5

18 фев 21, 15:47    [22282923]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 587
alekcvp
А что будет, если поток посылает SendNotifyMessage(), а юзер открыл APPL_MODAL сообщение и ушел?..

А ничего на самом деле. Окно висит, сообщения обрабатываются
18 фев 21, 15:49    [22282924]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
_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;
Хотя на реальном проекте у меня сделано так
+
procedure TCalcThread.Execute;
begin
  ......
  PostMessage(MainForm.Handle, WM_MY_NOTIFY, 0, 0);
  ....
end;

procedure TMainForm.WMMyNotify(var AMsg: TMessage);
begin
  UpdateVCL;
  ClearMsgQueue(Handle, WM_MY_NOTIFY);
end;

function ClearMsgQueue(AWnd: HWND; AMsg: Cardinal): TMsg;
var
  LMsg: TMsg;
begin
  Result.message := 0;
  while PeekMessage(LMsg, AWnd, AMsg, AMsg, PM_NOREMOVE) and
        (LMsg.message <> WM_QUIT)
  do begin
    PeekMessage(LMsg, AWnd, AMsg, AMsg, PM_REMOVE);
    Result := LMsg;
  end;
end;
18 фев 21, 15:52    [22282929]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4404
Dimitry Sibiryakov
YuRock
Первая процедура, вызванная в synchronize, еще не завершилась, а уже запустилась другая.

А ты всерьёз полагал, что Synchronize в двух разных потоках обязаны синхронизироваться не
только с главным потоком, но и между собой? Да, это полный крах логики.
Я, честно говоря, его использовал полтора раза в жизни.
Но была мысль, да.
18 фев 21, 16:12    [22282943]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
rgreat
Member

Откуда:
Сообщений: 6563
_Vasilisk_,

И зачем так все усложнять...
18 фев 21, 16:35    [22282954]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
alekcvp
Member

Откуда:
Сообщений: 2730
Dimitry Sibiryakov

YuRock
Первая процедура, вызванная в synchronize, еще не завершилась, а уже запустилась другая.

А ты всерьёз полагал, что Synchronize в двух разных потоках обязаны синхронизироваться не
только с главным потоком, но и между собой? Да, это полный крах логики.

А как они могут выполняться параллельно в одном потоке? Квантовая однопоточность что-ли?
Типа выполняется один поток, но неизвестно какой? 😁

Разумеется, при условии что первый Synchronize не вызывает ProcessMessages().

Сообщение было отредактировано: 18 фев 21, 17:08
18 фев 21, 17:14    [22282988]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52445

alekcvp
А как они могут выполняться параллельно *в одном потоке*?

Рекурсивно.

Posted via ActualForum NNTP Server 1.5

18 фев 21, 17:43    [22283003]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12572
rgreat
И зачем так все усложнять...
Чтобы не лепить костыли в виде таймера
alekcvp
Разумеется, при условии что первый Synchronize не вызывает ProcessMessages().
Ему достаточно вызвать ShowModal/ShowMessage/Dialog.Execute
18 фев 21, 18:18    [22283028]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
rgreat
Member

Откуда:
Сообщений: 6563
_Vasilisk_
Чтобы не лепить костыли в виде таймера

Я бы сказал что твой вариант мне кажется более костыльным.

Да и без таймера в обработке GUI на длительных задачах чаще всего все равно не обойтись.
По таймеру можно делать плавную анимацию прогресса даже если сами итерации в расчетном потоке редки или неравномерны.
18 фев 21, 18:30    [22283038]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2469
_Vasilisk_
Чтобы не лепить костыли в виде таймера
+1
19 фев 21, 02:11    [22283220]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 6255
white_nigger
_Vasilisk_
Чтобы не лепить костыли в виде таймера
+1
в чём костыль то?
GUI должен заниматься GUI, расчётчик должен расчитывать - как ни парадоксально звучит
19 фев 21, 08:28    [22283242]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2469
kealon(Ruslan)
в чём костыль то?
GUI должен заниматься GUI, расчётчик должен расчитывать - как ни парадоксально звучит
Нехрена из GUI лезть в работающий поток. Поток сам знает когда и что надо отобразить при изменении своего состояния - вот пусть Queue и зовет
19 фев 21, 16:06    [22283568]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52445

white_nigger
Поток сам знает когда и что надо отобразить при изменении своего состояния

Отображать прогресс на каждую итерацию цикла - самый надёжный способ получить невыносимые
тормоза.

Posted via ActualForum NNTP Server 1.5

19 фев 21, 16:13    [22283574]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
rgreat
Member

Откуда:
Сообщений: 6563
white_nigger
Нехрена из GUI лезть в работающий поток.
Не надо туда лезть.
Поток должен складывать результат своей работы в специальный контейнер в который есть доступ у GUI потока.

В таком случае потоки работают независимо друг от друга и друг другу не мешают.
19 фев 21, 16:42    [22283597]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3788
rgreat,

поддерживаю. потоку входные данные где-то отдали и оставили его в покое.
поток считает. если есть необходимость продвигает прогресс через какой-то синхронный код (лучше, конечно, не за одну итерацию, но тут всяко бывает. бывает что итерации долгие)
когда досчитал результат, сложил куда-то в переменную и сказал гую что готово. всё.
19 фев 21, 19:15    [22283718]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
rgreat
Member

Откуда:
Сообщений: 6563
makhaon
если есть необходимость продвигает прогресс через какой-то синхронный код

А я обычно использую контейнер с доступом к нему через обычную TCriticalSection.

При этом более важный поток заходит туда через .Enter a менее важный через TryEnter.
19 фев 21, 19:23    [22283723]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12572
Dimitry Sibiryakov
Отображать прогресс на каждую итерацию цикла - самый надёжный способ получить невыносимые тормоза.
Заметь, об отображении каждой итерации речи не идет. Весь вопрос в том, забирать ли данные только после того, как они гарантировано обновились или по таймеру прогревать процессор.
rgreat
При этом более важный поток заходит туда через .Enter a менее важный через TryEnter.
О! Вообще классно
Thread1 (GUI)Thread2 (Calc)
OnTimer
TryLock
Read (-1)Lock (Wait)
Unlock Locked
Write (0)
Unlock
OnTimer
TryLock
Read (0)Lock (Wait)
Unlock Locked
Write (1)
Unlock
ну подумаешь, случайно совпал интервал таймера и вычислений
19 фев 21, 20:17    [22283759]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2469
Dimitry Sibiryakov
Отображать прогресс на каждую итерацию цикла - самый надёжный способ получить невыносимые
тормоза.
С дуру можно и хрен сломать. Или изобретать свои велосипеды/сиххронизации там где не надо
19 фев 21, 20:34    [22283769]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
rgreat
Member

Откуда:
Сообщений: 6563
_Vasilisk_,

Что у тебя в таблице за цифры? Не понятно что не так.

Чего страшного от того что забор данных может изредка совпасть с сохранением результата расчета?
Либо GUI тред в этот раз не отработает, либо Calc тред совсем немного подождет.

Сообщение было отредактировано: 19 фев 21, 23:21
19 фев 21, 23:19    [22283840]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4404
rgreat
_Vasilisk_,

Что у тебя в таблице за цифры? Не понятно что не так.

Чего страшного от того что забор данных может изредка совпасть с сохранением результата расчета?
Либо GUI тред в этот раз не отработает, либо Calc тред совсем немного подождет.
Теоретически возможно, что GUI тред будет постоянно ломиться в тот момент, когда ресурс залочен.
20 фев 21, 02:26    [22283868]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
rgreat
Member

Откуда:
Сообщений: 6563
YuRock,

Вообще, в нормально написанном ПО время сохранения данных в "экспортный" контейнер должно составлять исчезающе малую честь времени в сравнении с периодом цикла таймера GUI и цикла таймера Calc потока.

Так что вероятность постоянного пропуска цикла должна быть порядка уровня шанса внезапного взрыва сверхновой на солнце.

Если боязно можно обойтись и без TryEnter, но тогда стоит написать код так что бы запись и чтение из контейнера занимали около нуля микросекунд.
Т.е. Lock, Assign, Unlock.

Ну или вообще TInterlocked.Exchange без всяких критических секций.

Сообщение было отредактировано: 20 фев 21, 03:22
20 фев 21, 03:19    [22283875]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
rgreat
Member

Откуда:
Сообщений: 6563
Ну и собственно если GUI поток обновляет данные раз в секунду а Calc поток раз в минуту то максимально теоретически возможно пропустить только одно из 60 обновлений GUI.
20 фев 21, 03:33    [22283876]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4404
rgreat
Если боязно можно обойтись и без TryEnter, но тогда стоит написать код так что бы запись и чтение из контейнера занимали около нуля микросекунд.
Т.е. Lock, Assign, Unlock.
Так и надо делать. При чем тут боязно.
Один поток пишет иногда какую-нибудь сотню байт, gui - читает эти байты раз в секунду.
Даже если произойдет блокировка - она продлится в районе 0-16 мс. В любом случае времени это займет столько. Нисколько, короче. При этом будет гарантия обновления экрана.
20 фев 21, 03:55    [22283878]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Delphi Ответить