Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа с потоками. Вопрос по синхронизации / 25 сообщений из 51, страница 1 из 3
17.02.2021, 12:20
    #40046154
garun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками. Вопрос по синхронизации
Есть процедура, которая работает с 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.
procedure JobVCL;
begin
  TThread.Synchronize(nil, procedure
 begin
   // тут код работы с VCL
 end);
end;


TThread.CreateAnonymousThread(procedure
begin

 ...

 JobVCL;

... 

end).Start;
...
Рейтинг: 0 / 0
17.02.2021, 13:03
    #40046197
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками. Вопрос по синхронизации
Как удобней, так и делай. Принципиальной разницы нет
...
Рейтинг: 0 / 0
17.02.2021, 13:04
    #40046202
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками. Вопрос по синхронизации
garun,

Лучше вообще без синхронайз логику построить.
Пусть поток независимо занимается работой, можно обновлять какие-то общие данные-результаты для отображения.
А морда независимо что-то показывает. Иногда что-то берет из общих данных-результатов.
...
Рейтинг: 0 / 0
17.02.2021, 13:05
    #40046203
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками. Вопрос по синхронизации
YuRock
garun,

Лучше вообще без синхронайз логику построить.
Пусть поток независимо занимается работой, можно обновлять какие-то общие данные-результаты для отображения.
А морда независимо что-то показывает. Иногда что-то берет из общих данных-результатов.
+1.
Лучше по таймеру в основном потоке проверять результаты расчетов и выводить что нужно.
...
Рейтинг: 0 / 0
17.02.2021, 13:06
    #40046205
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками. Вопрос по синхронизации
YuRock
garun,

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

+
Слать из рабочих потоков форме сообщения и забыть про синхронайз
...
Рейтинг: 0 / 0
17.02.2021, 13:07
    #40046208
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками. Вопрос по синхронизации
garun,

по твоему коду правильнее так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure JobVCL;
begin
   // тут код работы с VCL
end;


TThread.CreateAnonymousThread(procedure
begin

 ...
  TThread.Synchronize(JobVCL);

... 

end).Start;
...
Рейтинг: 0 / 0
17.02.2021, 14:07
    #40046260
garun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками. Вопрос по синхронизации
Zelius,

"Правильнее" почему? Чем отличается работа моего кода от вашего?
...
Рейтинг: 0 / 0
17.02.2021, 14:13
    #40046265
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками. Вопрос по синхронизации
Fr0sT-Brutal
Как удобней, так и делай. Принципиальной разницы нет

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

Это однопоточная многопоточность.
...
Рейтинг: 0 / 0
17.02.2021, 14:29
    #40046273
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками. Вопрос по синхронизации
rgreat
ъъъъъ,

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

Корпоративная.
...
Рейтинг: 0 / 0
17.02.2021, 16:13
    #40046326
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками. Вопрос по синхронизации
garun

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

по хелпу , отличается одним вызовом и личными предпочтениями ) а так по сути тоже самое
...
Рейтинг: 0 / 0
17.02.2021, 16:51
    #40046334
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками. Вопрос по синхронизации
ъъъъъ
Fr0sT-Brutal
Как удобней, так и делай. Принципиальной разницы нет

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

У него Job в середине цикла вызывается, судя по "..." перед и после, значит, здесь все нормально
...
Рейтинг: 0 / 0
17.02.2021, 17:01
    #40046338
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками. Вопрос по синхронизации
Fr0sT-Brutal
У него Job в середине цикла вызывается, судя по "..." перед и после, значит, здесь все нормально
Особенно все будет "нормально" если основной поток висит где-нибудь на каком-нибудь ShowMessage или ином диалог боксе.
...
Рейтинг: 0 / 0
18.02.2021, 12:22
    #40046596
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками. Вопрос по синхронизации
rgreat
Особенно все будет "нормально" если основной поток висит где-нибудь на каком-нибудь ShowMessage или ином диалог боксе.
Поэтому надо вызывать Queue, а не Synchronize...
...
Рейтинг: 0 / 0
18.02.2021, 13:18
    #40046636
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками. Вопрос по синхронизации
alekcvp,

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

Вопрос 1: Что будет, если юзер закроет диалог весьма не скоро, а в очереди накопится огромное кол-во вызовов синхронизированной процедуры?
Вопрос 2: Через сколько времени в ОС кончатся ресурсы и все упадет, если юзер так и не закроет диалог?
...
Рейтинг: 0 / 0
18.02.2021, 13:45
    #40046653
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками. Вопрос по синхронизации
rgreat
А теперь представь что это Queue вызывается допустим N раз в секунду, а юзер открыл какой-то диалог и ушел.
Ничего.

Модальное окно не блокирует обработку Queue/Synchoronize
...
Рейтинг: 0 / 0
18.02.2021, 14:10
    #40046670
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками. Вопрос по синхронизации
_Vasilisk_
Модальное окно не блокирует обработку Queue/Synchoronize
Ок, ты прав.
Но тогда выбери сам любую другую причину длительной занятости главного потока.
...
Рейтинг: 0 / 0
18.02.2021, 14:25
    #40046681
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками. Вопрос по синхронизации
rgreat
Но тогда выбери сам любую другую причину длительной занятости главного потока.
А тогда будет ломаться любой метод синхронизации с главным потоком
...
Рейтинг: 0 / 0
18.02.2021, 14:26
    #40046683
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками. Вопрос по синхронизации
_Vasilisk_
rgreat
А теперь представь что это Queue вызывается допустим N раз в секунду, а юзер открыл какой-то диалог и ушел.
Ничего.

Модальное окно не блокирует обработку Queue/Synchoronize
Даже если это модальное окно вызвалось из Queue/Synchoronize?
...
Рейтинг: 0 / 0
18.02.2021, 14:33
    #40046691
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками. Вопрос по синхронизации
YuRock
Даже если это модальное окно вызвалось из Queue/Synchoronize?
Ага.
...
Рейтинг: 0 / 0
18.02.2021, 14:47
    #40046705
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками. Вопрос по синхронизации
_Vasilisk_,

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

Я знаю решение: в главном потоке вместо GetMessage использовать MsgWaitForMultipleObjects, а из вычислителя дергать SetEvent. Но в VCL такое не прикрутишь
...
Рейтинг: 0 / 0
18.02.2021, 15:00
    #40046720
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками. Вопрос по синхронизации
rgreat
alekcvp,
А теперь представь что это Queue вызывается допустим N раз в секунду, а юзер открыл какой-то диалог и ушел.
А что будет, если поток посылает SendNotifyMessage(), а юзер открыл APPL_MODAL сообщение и ушел?..
...
Рейтинг: 0 / 0
18.02.2021, 15:01
    #40046721
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками. Вопрос по синхронизации
_Vasilisk_,

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

Имхо так надежней и безопасней чем через sendmessage.
Ну и это кроссплатформенно, как бонус.
...
Рейтинг: 0 / 0
18.02.2021, 15:04
    #40046727
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками. Вопрос по синхронизации
rgreat
Ну и это кроссплатформенно, как бонус.
Queue/Synchronize nj;t rроссплатформенно
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа с потоками. Вопрос по синхронизации / 25 сообщений из 51, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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