powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа с потоками. Вопрос по синхронизации
25 сообщений из 51, страница 2 из 3
Работа с потоками. Вопрос по синхронизации
    #40046732
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Но не sendmessage.
...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40046749
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
YuRock
Даже если это модальное окно вызвалось из Queue/Synchoronize?
Ага.
Странная синхронизация получается.
Первая процедура, вызванная в synchronize, еще не завершилась, а уже запустилась другая.
Это грозит крахом логики.

Впрочем, с обычными сообщениями - те же проблемы возможны. Я просто думал, что там реальная очередь выполнений.
...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40046751
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockПервая процедура, вызванная в synchronize, еще не завершилась, а уже запустилась другая.

А ты всерьёз полагал, что Synchronize в двух разных потоках обязаны синхронизироваться не
только с главным потоком, но и между собой? Да, это полный крах логики.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40046752
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp
А что будет, если поток посылает SendNotifyMessage(), а юзер открыл APPL_MODAL сообщение и ушел?..

А ничего на самом деле. Окно висит, сообщения обрабатываются
...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40046756
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Если бы у меня зависал главный поток, то я бы делал синхронизацию через промежуточный поток

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
procedure TCalcThread.Execute;
begin
  ......
  SetEvent(NotifyEvent);
  ....
end;

procedure TNotifyThread.Execute;
begin
  while not Terminated do begin
    WaitForSingleObject(NotifyEvent);
    Synchronize(UpdateVCL)
  end;
end;

Хотя на реальном проекте у меня сделано так
Код: 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.
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;

...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40046765
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
YuRockПервая процедура, вызванная в synchronize, еще не завершилась, а уже запустилась другая.

А ты всерьёз полагал, что Synchronize в двух разных потоках обязаны синхронизироваться не
только с главным потоком, но и между собой? Да, это полный крах логики.Я, честно говоря, его использовал полтора раза в жизни.
Но была мысль, да.
...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40046772
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

И зачем так все усложнять...
...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40046794
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

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

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

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

Разумеется, при условии что первый Synchronize не вызывает ProcessMessages().
...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40046806
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpА как они могут выполняться параллельно *в одном потоке*?

Рекурсивно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40046825
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
И зачем так все усложнять...
Чтобы не лепить костыли в виде таймера
alekcvp
Разумеется, при условии что первый Synchronize не вызывает ProcessMessages().
Ему достаточно вызвать ShowModal/ShowMessage/Dialog.Execute
...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40046833
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Чтобы не лепить костыли в виде таймера

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

Да и без таймера в обработке GUI на длительных задачах чаще всего все равно не обойтись.
По таймеру можно делать плавную анимацию прогресса даже если сами итерации в расчетном потоке редки или неравномерны.
...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40046963
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Чтобы не лепить костыли в виде таймера
+1
...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40046983
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger
_Vasilisk_
Чтобы не лепить костыли в виде таймера
+1
в чём костыль то?
GUI должен заниматься GUI, расчётчик должен расчитывать - как ни парадоксально звучит
...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40047194
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
в чём костыль то?
GUI должен заниматься GUI, расчётчик должен расчитывать - как ни парадоксально звучит
Нехрена из GUI лезть в работающий поток. Поток сам знает когда и что надо отобразить при изменении своего состояния - вот пусть Queue и зовет
...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40047198
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerПоток сам знает когда и что надо отобразить при изменении своего состояния

Отображать прогресс на каждую итерацию цикла - самый надёжный способ получить невыносимые
тормоза.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40047212
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger
Нехрена из GUI лезть в работающий поток.
Не надо туда лезть.
Поток должен складывать результат своей работы в специальный контейнер в который есть доступ у GUI потока.

В таком случае потоки работают независимо друг от друга и друг другу не мешают.
...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40047295
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

поддерживаю. потоку входные данные где-то отдали и оставили его в покое.
поток считает. если есть необходимость продвигает прогресс через какой-то синхронный код (лучше, конечно, не за одну итерацию, но тут всяко бывает. бывает что итерации долгие)
когда досчитал результат, сложил куда-то в переменную и сказал гую что готово. всё.
...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40047298
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon
если есть необходимость продвигает прогресс через какой-то синхронный код

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

При этом более важный поток заходит туда через .Enter a менее важный через TryEnter.
...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40047319
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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ну подумаешь, случайно совпал интервал таймера и вычислений
...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40047327
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Отображать прогресс на каждую итерацию цикла - самый надёжный способ получить невыносимые
тормоза.
С дуру можно и хрен сломать. Или изобретать свои велосипеды/сиххронизации там где не надо
...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40047376
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

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

Чего страшного от того что забор данных может изредка совпасть с сохранением результата расчета?
Либо GUI тред в этот раз не отработает, либо Calc тред совсем немного подождет.
...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40047395
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
_Vasilisk_,

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

Чего страшного от того что забор данных может изредка совпасть с сохранением результата расчета?
Либо GUI тред в этот раз не отработает, либо Calc тред совсем немного подождет.
Теоретически возможно, что GUI тред будет постоянно ломиться в тот момент, когда ресурс залочен.
...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40047398
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

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

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

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

Ну или вообще TInterlocked.Exchange без всяких критических секций.
...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40047399
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и собственно если GUI поток обновляет данные раз в секунду а Calc поток раз в минуту то максимально теоретически возможно пропустить только одно из 60 обновлений GUI.
...
Рейтинг: 0 / 0
Работа с потоками. Вопрос по синхронизации
    #40047401
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Если боязно можно обойтись и без TryEnter, но тогда стоит написать код так что бы запись и чтение из контейнера занимали около нуля микросекунд.
Т.е. Lock, Assign, Unlock.
Так и надо делать. При чем тут боязно.
Один поток пишет иногда какую-нибудь сотню байт, gui - читает эти байты раз в секунду.
Даже если произойдет блокировка - она продлится в районе 0-16 мс. В любом случае времени это займет столько. Нисколько, короче. При этом будет гарантия обновления экрана.
...
Рейтинг: 0 / 0
25 сообщений из 51, страница 2 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа с потоками. Вопрос по синхронизации
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]