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

Откуда: Казань
Сообщений: 7001
wadman
Так я избавляюсь от ожидания.

сложно это все. Я проще поступаю: если надо дождаться в доп.потоке реакции от главного - делаю Synchronize/SendMessage, если пофиг - Queue/PostMessage :)

Сообщение было отредактировано: 4 авг 20, 14:44
4 авг 20, 14:46    [22177465]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Dimitry Sibiryakov
Member

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

Док
если надо дождаться в доп.потоке реакции от главного - делаю Synchronize/SendMessage

В моё время Synchronize не принимал параметры и не позволял вернуть значение, приходилось
всё делать через левые переменные.

Posted via ActualForum NNTP Server 1.5

4 авг 20, 15:01    [22177479]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Vizit0r
Member

Откуда: Одесса
Сообщений: 864
Док
kealon(Ruslan)
и для VCL я это советую

И не знаешь, кого слушать :)

Это как с Application.ProcessMessages - все кричат, что его применение - моветон и чревато страшными багами, а на деле - вероятность можно на пальцах посчитать


а на деле вопрос получения трудновыловимых багов от Application.ProcessMessages в случае многопоточного приложения - это вопрос времени.
А первый раз, не зная куда копать - можно очень долго искать причину.
4 авг 20, 16:00    [22177514]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Док
Member

Откуда: Казань
Сообщений: 7001
Vizit0r
а на деле вопрос получения трудновыловимых багов от Application.ProcessMessages в случае многопоточного приложения - это вопрос времени.

да расслабьтесь, я его втыкаю только в тестовых приложениях :)
4 авг 20, 17:05    [22177554]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Vizit0r
Member

Откуда: Одесса
Сообщений: 864
Док,
я из своего опыта просто делюсь...
4 авг 20, 17:46    [22177575]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1347
Vizit0r
Док
пропущено...

И не знаешь, кого слушать :)

Это как с Application.ProcessMessages - все кричат, что его применение - моветон и чревато страшными багами, а на деле - вероятность можно на пальцах посчитать


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


Неоднократно сталкивался с проблемами, которые проявлялись при использовании Application.ProcessMessages. Поэтому в "учебнике" никому советовать использовать Application.ProcessMessages не буду.

Например, были попытки с помощью Application.ProcessMessages организовать цикл ожидания окончания работы дополнительного потока. Получается фигня. Лучше модальное окно показать с какой-нибудь анимацией и закрывать его при окончании работы потока. Причем модальное окно можно делать невидимым первые 5 секунд. Позже я опишу этот приём в "учебнике".
4 авг 20, 23:23    [22177677]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
rgreat
Member

Откуда:
Сообщений: 6648
DmSer
были попытки с помощью Application.ProcessMessages организовать цикл ожидания окончания работы дополнительного потока
Нафига, если есть Timer и Event-ы?

ProcessMessages нужен для того что бы интерфейс не залипал при длительной работе в основном потоке. Да и то надо в уме держать возможные побочные эффекты, и например, отключать ненужные возможности по вводу данных в GUI.
4 авг 20, 23:48    [22177679]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1347
rgreat
DmSer
были попытки с помощью Application.ProcessMessages организовать цикл ожидания окончания работы дополнительного потока
Нафига, если есть Timer и Event-ы?

ProcessMessages нужен для того что бы интерфейс не залипал при длительной работе в основном потоке. Да и то надо в уме держать возможные побочные эффекты, и например, отключать ненужные возможности по вводу данных в GUI.


Я уже как-то рассказывал, в этом году обнаружил код в нашем ПО, в котором запускался доп. поток для формирования отчета и выполнялось ожидание окончания формирования отчёта с помощью цикла:
while not RepThread.Ready do
begin
  Sleep(10);
  Application.ProcessMessages;
end; 


В случае, если сервер отчётов находился не в локальной сети, а где-то в сети интернет, то метод ProcessMessages не возвращал управление (но GUI при этом обновлялся). Детально не разбирался, почему так. Просто реализовал ожидание с помощью модальной формы и теперь никаких зависаний нет.

Сообщение было отредактировано: 5 авг 20, 08:34
5 авг 20, 08:37    [22177739]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4522
DmSer
rgreat
пропущено...
Нафига, если есть Timer и Event-ы?

ProcessMessages нужен для того что бы интерфейс не залипал при длительной работе в основном потоке. Да и то надо в уме держать возможные побочные эффекты, и например, отключать ненужные возможности по вводу данных в GUI.


Я уже как-то рассказывал, в этом году обнаружил код в нашем ПО, в котором запускался доп. поток для формирования отчета и выполнялось ожидание окончания формирования отчёта с помощью цикла:
while not RepThread.Ready do
begin
  Sleep(10);
  Application.ProcessMessages;
end; 



В случае, если сервер отчётов находился не в локальной сети, а где-то в сети интернет, то метод ProcessMessages не возвращал управление (но GUI при этом обновлялся). Детально не разбирался, почему так. Просто реализовал ожидание с помощью модальной формы и теперь никаких зависаний нет.

О, господи.
Мне кажется, правильнее было бы реализовать "ожидание" убрав формирование отчета из доп потока в главный. Раз уж зачем-то нужно "ожидание".
5 авг 20, 09:33    [22177759]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1347
YuRock

Мне кажется, правильнее было бы реализовать "ожидание" убрав формирование отчета из доп потока в главный. Раз уж зачем-то нужно "ожидание".


В нашем случае ПО управляет ещё кучей устройств, главный поток дёргается постоянно, поэтому мы не можем надолго его блокировать.
5 авг 20, 09:53    [22177778]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Док
Member

Откуда: Казань
Сообщений: 7001
DmSer
запускался доп. поток для формирования отчета и выполнялось ожидание окончания формирования отчёта с помощью цикла:

а в доп.потоке-то оно зачем?
5 авг 20, 18:00    [22178135]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
roschinspb
Member

Откуда: С-Пб
Сообщений: 1641
Hi
Во-первых, хочу по-приветствовать идею написания книги, выразить моральную поддержку и пожелать творческих успехов.

Во-вторых, позволь внести пару предложений.
В разделе 1.2. надо как-то более сжато выделить проблемы и требования к многопоточным приложениям. Что-то типа этого:
1. Библиотеки графических компонентов (как VCL так и FMX) способны корректно работать только в основном потоке, обращение к ним напрямую из любых других потоков недопустимо (как допустимо будет сказано ниже).
2. Обращение к данным внутри потока напрямую также недопустимо, так как в любой случайный момент времени данные могут быть еще полностью не сформированы, память не выделена, или уже уничтожена.
3. Многие не графические компоненты скрыто взаимодействуют между собой и графическим интерфейсом приводя к нарушениям требований 1 и 2. Например: TSQLConnection, TSQLDataSet, TDataSource и TDBEdit.
4. Требования из предыдущих пунктов ни как не контролируется средой разработки и требует особой внимательности разработчика. При этом ошибки носят вероятностный характер. Зачастую возможность появления ошибки зависит от скорости работы процессора, заполненности памяти, скорости работы сети и т.п.
5. Даже в случае правильной и безошибочной работы приложения не всегда возможна подлинная многозадачность. Например: выполнение длительных запросов в рамках одной сессий Oracle не может выполняться параллельно, т.е. запустив выполнение длительного запроса в отдельном потоке пользователь тем не менее всё равно не сможет полноценно работать с данными.

Когда вы собираетесь выносить часть кода в отдельный поток следует обратить внимание на следующие моменты:
1. Необходимо максимально сократить доступ к графическому интерфейсу, в идеале совсем исключить.
2. Необходимо максимально изолировать код внутри потока. Например: создаем модуль данных, подключаемся к БД, выполняем запрос, записываем результаты выполнения, разрушаем модуль данных.
3. Обязательно надо убедиться в потокозащищенности используемых в потоке компонентов. Причем декларируемая потокозащищенность не всегда соответствует действительности.
4. Следует убедиться в наличие достаточных человеческих ресурсов. Отладка будет на порядок сложнее, подумайте еще раз стоит ли игра свеч? Может целесообразней вынести долгое вычисление в отдельное приложение? Нужна ли действительно постоянная активность графического интерфейса, или достаточно простого окна ожидания?

Возможно стоит вынести код не в отдельный поток а в отдельное небольшое консольное приложение.
5 авг 20, 18:27    [22178160]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1347
roschinspb,
Спасибо за предложения! Я их проанализирую и постараюсь отразить в статье.
5 авг 20, 19:30    [22178183]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Док
Member

Откуда: Казань
Сообщений: 7001
roschinspb,

Сереж, у тебя же на "народе" небольшая статья была с примерами потоков...
5 авг 20, 23:09    [22178245]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
makhaon
Member

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

автор
4. Следует убедиться в наличие достаточных человеческих ресурсов. Отладка будет на порядок сложнее, подумайте еще раз стоит ли игра свеч? Может целесообразней вынести долгое вычисление в отдельное приложение? Нужна ли действительно постоянная активность графического интерфейса, или достаточно простого окна ожидания?


я бы не сказал, что так уж сложно и на порядок. достаточно придерживаться известных принципов: не лезть к vcl и к расшаренным ресурсам и в 99% случаев всё сразу же заработает. невизуальные компоненты, имеющие проблемы в многопоточке - скорее исключение.
долгие вычисления как правило предполагают много данных и гонять данные между приложениями в обе стороны - то еще удовольствие

Сообщение было отредактировано: 6 авг 20, 09:16
6 авг 20, 09:14    [22178314]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Zelius
Member

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

не так уж и сложно гонять.

доп процесс полезен если используются сторонние библиотеки, которые могут привести к зависанию программы. пришлось так делать когда использовал bass что бы писать интернет радио...
6 авг 20, 09:35    [22178323]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Vizit0r
Member

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

не так уж и сложно гонять.

доп процесс полезен если используются сторонние библиотеки, которые могут привести к зависанию программы. пришлось так делать когда использовал bass что бы писать интернет радио...


это скорее исключение.
А в целом - гораздо полезнее разобраться с потоками, чем с межпроцессным взаимодействием.
6 авг 20, 10:30    [22178358]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Zelius
Member

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

полезнее знать что делать, когда программа виснет в чужой dll и никакие потоки не спасают, т.к. их не перезапустить...
6 авг 20, 11:22    [22178414]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1347
Zelius
makhaon,

не так уж и сложно гонять.

доп процесс полезен если используются сторонние библиотеки, которые могут привести к зависанию программы. пришлось так делать когда использовал bass что бы писать интернет радио...


К сожалению, межпроцессное взаимодействие это не та задача, которая возникает у большинства Delphi-программистов каждый день. В RTL, если не ошибаюсь, нет практически ничего готового в помощь для решения этой задачи (я не говорю о взаимодействии по TCP или через COM, тут как раз более менее всё необходимое имеется). Если возникает задача организовать взаимодействие между процессами в рамках одного компьютера, то, думаю, каждый Delphi-программист вынужден мастерить свой велосипед.
6 авг 20, 12:08    [22178453]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1347
roschinspb,

а где предложение про Окно, отображающее ход выполне­ния длительной операции? :)
Было бы уместным!
С ним кстати не было проблем/сбоев? Работает во всех версиях Delphi?
6 авг 20, 12:16    [22178457]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1347
Так или иначе, "учебник" в первую очередь о том, как научиться многопоточному программированию в Delphi (в идеале, для решения различных задач, где уместна многопоточность), а не о том, как решать различные задачи, не прибегая к многопоточному программированию.
6 авг 20, 12:20    [22178461]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Vizit0r
Member

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

полезнее знать что делать, когда программа виснет в чужой dll и никакие потоки не спасают, т.к. их не перезапустить...


это уже сильно частные случаи, на самом деле.
6 авг 20, 13:37    [22178549]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
roschinspb
Member

Откуда: С-Пб
Сообщений: 1641
DmSer
roschinspb,

а где предложение про Окно, отображающее ход выполне­ния длительной операции? :)
Было бы уместным!
С ним кстати не было проблем/сбоев? Работает во всех версиях Delphi?

Для начинающих пример сложноват. Это скорее для второго тома. Многопоточное программирование для тех, кто бросает. 😁. Вообще на сайте не последняя версия. Последняя с исправлениями для 64 бит погибла вместе с винчестером. Когдато яя её кому-то выслал, может где и есть еще.
6 авг 20, 15:32    [22178666]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
roschinspb
Member

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

Я не знаю какая у тебя предметная область... у меня всякие клиент-серверные приложения, весьма крупные. И вот сколько бы контор не сменил почти во всех натыкался на решения "а не выполнить ли мне долгие запросы в отдельном потоке". И использовать какраз компоненты имеющие проблемы в многопоточке и которые обращаются к графическому интерфейсу скрыто от глаз молодого бойца.
Описание проблемы в терминах тестировщика типа: "вот чето у нас всё работает, а у клиентов... у некоторых... иногда зависает в непонятных местах".
Код хорошо характеризует высказывание одного патологоанатома:
В нашем морге последними словами 40% клиентов было "Гляди посоны как я могу!", а половина клиентов последнее что сказала "Не, дай я покажу как надо!".
Почти всегда исправление заключается в тупом переносе кода в основной поток. Прогрессбар можно перерисовать и repaint-ом, а обеспечивать реальную параллельную работу пользователя и так не требовалось.

makhaon

долгие вычисления как правило предполагают много данных и гонять данные между приложениями в обе стороны - то еще удовольствие
А мне вот кажется что вычислительные задачи сводятся к "Получить данные из файла" -> "обработать" -> "сохранить результаты в файл". Вcё просто, ни каких межпроцессных обменов, для особых эстетов разве что процент выполнения можно прикрутить.

P.S. Я не призываю отказаться от тредов вообще и не надо меня убеждать в том что иногда они нужны. Я просто пытаюсь избавить от лишних проблем начинающих программеров и тех кто потом за ними будет код чистить.
6 авг 20, 17:43    [22178747]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточное программирование в Delphi для начинающих  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 677
Так вот кто гуглу насоветовал про процессы, так что теперь хром плодит свои копии интенсивней, чем зерглинги вылупляются!
7 авг 20, 00:40    [22178863]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4] 5 6   вперед  Ctrl      все
Все форумы / Delphi Ответить