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

Откуда:
Сообщений: 587
Как удобней, так и делай. Принципиальной разницы нет
17 фев 21, 13:03    [22282202]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4403
garun,

Лучше вообще без синхронайз логику построить.
Пусть поток независимо занимается работой, можно обновлять какие-то общие данные-результаты для отображения.
А морда независимо что-то показывает. Иногда что-то берет из общих данных-результатов.
17 фев 21, 13:04    [22282207]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
rgreat
Member

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

Лучше вообще без синхронайз логику построить.
Пусть поток независимо занимается работой, можно обновлять какие-то общие данные-результаты для отображения.
А морда независимо что-то показывает. Иногда что-то берет из общих данных-результатов.
+1.
Лучше по таймеру в основном потоке проверять результаты расчетов и выводить что нужно.
17 фев 21, 13:05    [22282208]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
Fr0sT-Brutal
Member

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

Лучше вообще без синхронайз логику построить.
Пусть поток независимо занимается работой, можно обновлять какие-то общие данные-результаты для отображения.
А морда независимо что-то показывает. Иногда что-то берет из общих данных-результатов.

+
Слать из рабочих потоков форме сообщения и забыть про синхронайз
17 фев 21, 13:06    [22282210]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1522
garun,

по твоему коду правильнее так
procedure JobVCL;
begin
   // тут код работы с VCL
end;


TThread.CreateAnonymousThread(procedure
begin

 ...
  TThread.Synchronize(JobVCL);

... 

end).Start;
17 фев 21, 13:07    [22282214]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
garun
Member

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

"Правильнее" почему? Чем отличается работа моего кода от вашего?
17 фев 21, 14:07    [22282280]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1769
Fr0sT-Brutal
Как удобней, так и делай. Принципиальной разницы нет

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

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

Это однопоточная многопоточность.
17 фев 21, 14:15    [22282287]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1769
rgreat
ъъъъъ,

Это однопоточная многопоточность.

Корпоративная.
17 фев 21, 14:29    [22282296]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1522
garun

"Правильнее" почему? Чем отличается работа моего кода от вашего?

по хелпу, отличается одним вызовом и личными предпочтениями ) а так по сути тоже самое
17 фев 21, 16:13    [22282358]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 587
ъъъъъ
Fr0sT-Brutal
Как удобней, так и делай. Принципиальной разницы нет

...только треды начинают работать по очереди.

У него Job в середине цикла вызывается, судя по "..." перед и после, значит, здесь все нормально
17 фев 21, 16:51    [22282367]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
rgreat
Member

Откуда:
Сообщений: 6563
Fr0sT-Brutal
У него Job в середине цикла вызывается, судя по "..." перед и после, значит, здесь все нормально
Особенно все будет "нормально" если основной поток висит где-нибудь на каком-нибудь ShowMessage или ином диалог боксе.

Сообщение было отредактировано: 17 фев 21, 16:55
17 фев 21, 17:01    [22282371]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
alekcvp
Member

Откуда:
Сообщений: 2730
rgreat
Особенно все будет "нормально" если основной поток висит где-нибудь на каком-нибудь ShowMessage или ином диалог боксе.
Поэтому надо вызывать Queue, а не Synchronize...
18 фев 21, 12:22    [22282701]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
rgreat
Member

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

А теперь представь что это Queue вызывается допустим N раз в секунду, а юзер открыл какой-то диалог и ушел.

Вопрос 1: Что будет, если юзер закроет диалог весьма не скоро, а в очереди накопится огромное кол-во вызовов синхронизированной процедуры?
Вопрос 2: Через сколько времени в ОС кончатся ресурсы и все упадет, если юзер так и не закроет диалог?

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

Откуда: Украина, Харьков
Сообщений: 12572
rgreat
А теперь представь что это Queue вызывается допустим N раз в секунду, а юзер открыл какой-то диалог и ушел.
Ничего.

Модальное окно не блокирует обработку Queue/Synchoronize
18 фев 21, 13:45    [22282784]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
rgreat
Member

Откуда:
Сообщений: 6563
_Vasilisk_
Модальное окно не блокирует обработку Queue/Synchoronize
Ок, ты прав.
Но тогда выбери сам любую другую причину длительной занятости главного потока.
18 фев 21, 14:10    [22282808]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12572
rgreat
Но тогда выбери сам любую другую причину длительной занятости главного потока.
А тогда будет ломаться любой метод синхронизации с главным потоком
18 фев 21, 14:25    [22282823]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4403
_Vasilisk_
rgreat
А теперь представь что это Queue вызывается допустим N раз в секунду, а юзер открыл какой-то диалог и ушел.
Ничего.

Модальное окно не блокирует обработку Queue/Synchoronize
Даже если это модальное окно вызвалось из Queue/Synchoronize?
18 фев 21, 14:26    [22282825]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12572
YuRock
Даже если это модальное окно вызвалось из Queue/Synchoronize?
Ага.
18 фев 21, 14:33    [22282833]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
rgreat
Member

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

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

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

Откуда: Украина, Харьков
Сообщений: 12572
rgreat
Если инициатор обновлений гуя сам главный поток,
Т.е. главный поток должен постоянно опрашивать кучу, а не изменилось ли что-нибудь?

Я знаю решение: в главном потоке вместо GetMessage использовать MsgWaitForMultipleObjects, а из вычислителя дергать SetEvent. Но в VCL такое не прикрутишь
18 фев 21, 15:00    [22282870]     Ответить | Цитировать Сообщить модератору
 Re: Работа с потоками. Вопрос по синхронизации  [new]
alekcvp
Member

Откуда:
Сообщений: 2730
rgreat
alekcvp,
А теперь представь что это Queue вызывается допустим N раз в секунду, а юзер открыл какой-то диалог и ушел.
А что будет, если поток посылает SendNotifyMessage(), а юзер открыл APPL_MODAL сообщение и ушел?..

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

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

Да. По таймеру в процессе расчетов.

Имхо так надежней и безопасней чем через sendmessage.
Ну и это кроссплатформенно, как бонус.

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

Откуда: Украина, Харьков
Сообщений: 12572
rgreat
Ну и это кроссплатформенно, как бонус.
Queue/Synchronize nj;t rроссплатформенно
18 фев 21, 15:04    [22282879]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Delphi Ответить