|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
wadman Так я избавляюсь от ожидания. сложно это все. Я проще поступаю: если надо дождаться в доп.потоке реакции от главного - делаю Synchronize/SendMessage, если пофиг - Queue/PostMessage :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 14:46 |
|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
Докесли надо дождаться в доп.потоке реакции от главного - делаю Synchronize/SendMessage В моё время Synchronize не принимал параметры и не позволял вернуть значение, приходилось всё делать через левые переменные. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 15:01 |
|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
Док kealon(Ruslan) и для VCL я это советую И не знаешь, кого слушать :) Это как с Application.ProcessMessages - все кричат, что его применение - моветон и чревато страшными багами, а на деле - вероятность можно на пальцах посчитать а на деле вопрос получения трудновыловимых багов от Application.ProcessMessages в случае многопоточного приложения - это вопрос времени. А первый раз, не зная куда копать - можно очень долго искать причину. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 16:00 |
|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
Vizit0r а на деле вопрос получения трудновыловимых багов от Application.ProcessMessages в случае многопоточного приложения - это вопрос времени. да расслабьтесь, я его втыкаю только в тестовых приложениях :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 17:05 |
|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
Док, я из своего опыта просто делюсь... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 17:46 |
|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
Vizit0r Док пропущено... И не знаешь, кого слушать :) Это как с Application.ProcessMessages - все кричат, что его применение - моветон и чревато страшными багами, а на деле - вероятность можно на пальцах посчитать а на деле вопрос получения трудновыловимых багов от Application.ProcessMessages в случае многопоточного приложения - это вопрос времени. А первый раз, не зная куда копать - можно очень долго искать причину. Неоднократно сталкивался с проблемами, которые проявлялись при использовании Application.ProcessMessages. Поэтому в "учебнике" никому советовать использовать Application.ProcessMessages не буду. Например, были попытки с помощью Application.ProcessMessages организовать цикл ожидания окончания работы дополнительного потока. Получается фигня. Лучше модальное окно показать с какой-нибудь анимацией и закрывать его при окончании работы потока. Причем модальное окно можно делать невидимым первые 5 секунд. Позже я опишу этот приём в "учебнике". ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 23:23 |
|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
DmSer были попытки с помощью Application.ProcessMessages организовать цикл ожидания окончания работы дополнительного потока ProcessMessages нужен для того что бы интерфейс не залипал при длительной работе в основном потоке. Да и то надо в уме держать возможные побочные эффекты, и например, отключать ненужные возможности по вводу данных в GUI. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2020, 23:48 |
|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
rgreat DmSer были попытки с помощью Application.ProcessMessages организовать цикл ожидания окончания работы дополнительного потока ProcessMessages нужен для того что бы интерфейс не залипал при длительной работе в основном потоке. Да и то надо в уме держать возможные побочные эффекты, и например, отключать ненужные возможности по вводу данных в GUI. Я уже как-то рассказывал, в этом году обнаружил код в нашем ПО, в котором запускался доп. поток для формирования отчета и выполнялось ожидание окончания формирования отчёта с помощью цикла: Код: pascal 1. 2. 3. 4. 5.
В случае, если сервер отчётов находился не в локальной сети, а где-то в сети интернет, то метод ProcessMessages не возвращал управление (но GUI при этом обновлялся). Детально не разбирался, почему так. Просто реализовал ожидание с помощью модальной формы и теперь никаких зависаний нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2020, 08:37 |
|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
DmSer rgreat пропущено... Нафига, если есть Timer и Event-ы? ProcessMessages нужен для того что бы интерфейс не залипал при длительной работе в основном потоке. Да и то надо в уме держать возможные побочные эффекты, и например, отключать ненужные возможности по вводу данных в GUI. Я уже как-то рассказывал, в этом году обнаружил код в нашем ПО, в котором запускался доп. поток для формирования отчета и выполнялось ожидание окончания формирования отчёта с помощью цикла: Код: pascal 1. 2. 3. 4. 5.
В случае, если сервер отчётов находился не в локальной сети, а где-то в сети интернет, то метод ProcessMessages не возвращал управление (но GUI при этом обновлялся). Детально не разбирался, почему так. Просто реализовал ожидание с помощью модальной формы и теперь никаких зависаний нет. О, господи. Мне кажется, правильнее было бы реализовать "ожидание" убрав формирование отчета из доп потока в главный. Раз уж зачем-то нужно "ожидание". ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2020, 09:33 |
|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
YuRock Мне кажется, правильнее было бы реализовать "ожидание" убрав формирование отчета из доп потока в главный. Раз уж зачем-то нужно "ожидание". В нашем случае ПО управляет ещё кучей устройств, главный поток дёргается постоянно, поэтому мы не можем надолго его блокировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2020, 09:53 |
|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
DmSer запускался доп. поток для формирования отчета и выполнялось ожидание окончания формирования отчёта с помощью цикла: а в доп.потоке -то оно зачем? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2020, 18:00 |
|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
Hi Во-первых, хочу по-приветствовать идею написания книги, выразить моральную поддержку и пожелать творческих успехов. Во-вторых, позволь внести пару предложений. В разделе 1.2. надо как-то более сжато выделить проблемы и требования к многопоточным приложениям. Что-то типа этого: 1. Библиотеки графических компонентов (как VCL так и FMX) способны корректно работать только в основном потоке, обращение к ним напрямую из любых других потоков недопустимо (как допустимо будет сказано ниже). 2. Обращение к данным внутри потока напрямую также недопустимо, так как в любой случайный момент времени данные могут быть еще полностью не сформированы, память не выделена, или уже уничтожена. 3. Многие не графические компоненты скрыто взаимодействуют между собой и графическим интерфейсом приводя к нарушениям требований 1 и 2. Например: TSQLConnection, TSQLDataSet, TDataSource и TDBEdit. 4. Требования из предыдущих пунктов ни как не контролируется средой разработки и требует особой внимательности разработчика. При этом ошибки носят вероятностный характер. Зачастую возможность появления ошибки зависит от скорости работы процессора, заполненности памяти, скорости работы сети и т.п. 5. Даже в случае правильной и безошибочной работы приложения не всегда возможна подлинная многозадачность. Например: выполнение длительных запросов в рамках одной сессий Oracle не может выполняться параллельно, т.е. запустив выполнение длительного запроса в отдельном потоке пользователь тем не менее всё равно не сможет полноценно работать с данными. Когда вы собираетесь выносить часть кода в отдельный поток следует обратить внимание на следующие моменты: 1. Необходимо максимально сократить доступ к графическому интерфейсу, в идеале совсем исключить. 2. Необходимо максимально изолировать код внутри потока. Например: создаем модуль данных, подключаемся к БД, выполняем запрос, записываем результаты выполнения, разрушаем модуль данных. 3. Обязательно надо убедиться в потокозащищенности используемых в потоке компонентов. Причем декларируемая потокозащищенность не всегда соответствует действительности. 4. Следует убедиться в наличие достаточных человеческих ресурсов. Отладка будет на порядок сложнее, подумайте еще раз стоит ли игра свеч? Может целесообразней вынести долгое вычисление в отдельное приложение? Нужна ли действительно постоянная активность графического интерфейса, или достаточно простого окна ожидания? Возможно стоит вынести код не в отдельный поток а в отдельное небольшое консольное приложение. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2020, 18:27 |
|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
roschinspb, Спасибо за предложения! Я их проанализирую и постараюсь отразить в статье. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2020, 19:30 |
|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
roschinspb, Сереж, у тебя же на "народе" небольшая статья была с примерами потоков... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2020, 23:09 |
|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
roschinspb, автор4. Следует убедиться в наличие достаточных человеческих ресурсов. Отладка будет на порядок сложнее, подумайте еще раз стоит ли игра свеч? Может целесообразней вынести долгое вычисление в отдельное приложение? Нужна ли действительно постоянная активность графического интерфейса, или достаточно простого окна ожидания? я бы не сказал, что так уж сложно и на порядок. достаточно придерживаться известных принципов: не лезть к vcl и к расшаренным ресурсам и в 99% случаев всё сразу же заработает. невизуальные компоненты, имеющие проблемы в многопоточке - скорее исключение. долгие вычисления как правило предполагают много данных и гонять данные между приложениями в обе стороны - то еще удовольствие ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 09:14 |
|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
makhaon, не так уж и сложно гонять. доп процесс полезен если используются сторонние библиотеки, которые могут привести к зависанию программы. пришлось так делать когда использовал bass что бы писать интернет радио... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 09:35 |
|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
Zelius makhaon, не так уж и сложно гонять. доп процесс полезен если используются сторонние библиотеки, которые могут привести к зависанию программы. пришлось так делать когда использовал bass что бы писать интернет радио... это скорее исключение. А в целом - гораздо полезнее разобраться с потоками, чем с межпроцессным взаимодействием. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 10:30 |
|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
Vizit0r, полезнее знать что делать, когда программа виснет в чужой dll и никакие потоки не спасают, т.к. их не перезапустить... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 11:22 |
|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
Zelius makhaon, не так уж и сложно гонять. доп процесс полезен если используются сторонние библиотеки, которые могут привести к зависанию программы. пришлось так делать когда использовал bass что бы писать интернет радио... К сожалению, межпроцессное взаимодействие это не та задача, которая возникает у большинства Delphi-программистов каждый день. В RTL, если не ошибаюсь, нет практически ничего готового в помощь для решения этой задачи (я не говорю о взаимодействии по TCP или через COM, тут как раз более менее всё необходимое имеется). Если возникает задача организовать взаимодействие между процессами в рамках одного компьютера, то, думаю, каждый Delphi-программист вынужден мастерить свой велосипед. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 12:08 |
|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
roschinspb, а где предложение про Окно, отображающее ход выполнения длительной операции ? :) Было бы уместным! С ним кстати не было проблем/сбоев? Работает во всех версиях Delphi? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 12:16 |
|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
Так или иначе, "учебник" в первую очередь о том, как научиться многопоточному программированию в Delphi (в идеале, для решения различных задач, где уместна многопоточность), а не о том, как решать различные задачи, не прибегая к многопоточному программированию. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 12:20 |
|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
Zelius Vizit0r, полезнее знать что делать, когда программа виснет в чужой dll и никакие потоки не спасают, т.к. их не перезапустить... это уже сильно частные случаи, на самом деле. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 13:37 |
|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
DmSer roschinspb, а где предложение про Окно, отображающее ход выполнения длительной операции ? :) Было бы уместным! С ним кстати не было проблем/сбоев? Работает во всех версиях Delphi? Для начинающих пример сложноват. Это скорее для второго тома. Многопоточное программирование для тех, кто бросает. 😁. Вообще на сайте не последняя версия. Последняя с исправлениями для 64 бит погибла вместе с винчестером. Когдато яя её кому-то выслал, может где и есть еще. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 15:32 |
|
Многопоточное программирование в Delphi для начинающих
|
|||
---|---|---|---|
#18+
makhaon невизуальные компоненты, имеющие проблемы в многопоточке - скорее исключение Я не знаю какая у тебя предметная область... у меня всякие клиент-серверные приложения, весьма крупные. И вот сколько бы контор не сменил почти во всех натыкался на решения " а не выполнить ли мне долгие запросы в отдельном потоке ". И использовать какраз компоненты имеющие проблемы в многопоточке и которые обращаются к графическому интерфейсу скрыто от глаз молодого бойца. Описание проблемы в терминах тестировщика типа: " вот чето у нас всё работает, а у клиентов... у некоторых... иногда зависает в непонятных местах ". Код хорошо характеризует высказывание одного патологоанатома: В нашем морге последними словами 40% клиентов было "Гляди посоны как я могу!", а половина клиентов последнее что сказала "Не, дай я покажу как надо!". Почти всегда исправление заключается в тупом переносе кода в основной поток. Прогрессбар можно перерисовать и repaint-ом, а обеспечивать реальную параллельную работу пользователя и так не требовалось. makhaon долгие вычисления как правило предполагают много данных и гонять данные между приложениями в обе стороны - то еще удовольствие P.S. Я не призываю отказаться от тредов вообще и не надо меня убеждать в том что иногда они нужны. Я просто пытаюсь избавить от лишних проблем начинающих программеров и тех кто потом за ними будет код чистить. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 17:43 |
|
|
start [/forum/topic.php?fid=58&msg=39987213&tid=2036872]: |
0ms |
get settings: |
14ms |
get forum list: |
6ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
36ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
512ms |
get tp. blocked users: |
0ms |
others: | 2623ms |
total: | 3197ms |
0 / 0 |