powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Многопоточное программирование в Delphi для начинающих
25 сообщений из 160, страница 4 из 7
Многопоточное программирование в Delphi для начинающих
    #39986400
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
Так я избавляюсь от ожидания.

сложно это все. Я проще поступаю: если надо дождаться в доп.потоке реакции от главного - делаю Synchronize/SendMessage, если пофиг - Queue/PostMessage :)
...
Рейтинг: 0 / 0
Многопоточное программирование в Delphi для начинающих
    #39986409
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докесли надо дождаться в доп.потоке реакции от главного - делаю Synchronize/SendMessage

В моё время Synchronize не принимал параметры и не позволял вернуть значение, приходилось
всё делать через левые переменные.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Многопоточное программирование в Delphi для начинающих
    #39986437
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
kealon(Ruslan)
и для VCL я это советую

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

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


а на деле вопрос получения трудновыловимых багов от Application.ProcessMessages в случае многопоточного приложения - это вопрос времени.
А первый раз, не зная куда копать - можно очень долго искать причину.
...
Рейтинг: 0 / 0
Многопоточное программирование в Delphi для начинающих
    #39986465
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r
а на деле вопрос получения трудновыловимых багов от Application.ProcessMessages в случае многопоточного приложения - это вопрос времени.

да расслабьтесь, я его втыкаю только в тестовых приложениях :)
...
Рейтинг: 0 / 0
Многопоточное программирование в Delphi для начинающих
    #39986482
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,
я из своего опыта просто делюсь...
...
Рейтинг: 0 / 0
Многопоточное программирование в Delphi для начинающих
    #39986534
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r
Док
пропущено...

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

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


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


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

Например, были попытки с помощью Application.ProcessMessages организовать цикл ожидания окончания работы дополнительного потока. Получается фигня. Лучше модальное окно показать с какой-нибудь анимацией и закрывать его при окончании работы потока. Причем модальное окно можно делать невидимым первые 5 секунд. Позже я опишу этот приём в "учебнике".
...
Рейтинг: 0 / 0
Многопоточное программирование в Delphi для начинающих
    #39986535
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
были попытки с помощью Application.ProcessMessages организовать цикл ожидания окончания работы дополнительного потока
Нафига, если есть Timer и Event-ы?

ProcessMessages нужен для того что бы интерфейс не залипал при длительной работе в основном потоке. Да и то надо в уме держать возможные побочные эффекты, и например, отключать ненужные возможности по вводу данных в GUI.
...
Рейтинг: 0 / 0
Многопоточное программирование в Delphi для начинающих
    #39986579
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
DmSer
были попытки с помощью Application.ProcessMessages организовать цикл ожидания окончания работы дополнительного потока
Нафига, если есть Timer и Event-ы?

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


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



В случае, если сервер отчётов находился не в локальной сети, а где-то в сети интернет, то метод ProcessMessages не возвращал управление (но GUI при этом обновлялся). Детально не разбирался, почему так. Просто реализовал ожидание с помощью модальной формы и теперь никаких зависаний нет.
...
Рейтинг: 0 / 0
Многопоточное программирование в Delphi для начинающих
    #39986595
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
rgreat
пропущено...
Нафига, если есть Timer и Event-ы?

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


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




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

О, господи.
Мне кажется, правильнее было бы реализовать "ожидание" убрав формирование отчета из доп потока в главный. Раз уж зачем-то нужно "ожидание".
...
Рейтинг: 0 / 0
Многопоточное программирование в Delphi для начинающих
    #39986603
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock

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


В нашем случае ПО управляет ещё кучей устройств, главный поток дёргается постоянно, поэтому мы не можем надолго его блокировать.
...
Рейтинг: 0 / 0
Многопоточное программирование в Delphi для начинающих
    #39986831
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
запускался доп. поток для формирования отчета и выполнялось ожидание окончания формирования отчёта с помощью цикла:

а в доп.потоке -то оно зачем?
...
Рейтинг: 0 / 0
Многопоточное программирование в Delphi для начинающих
    #39986846
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi
Во-первых, хочу по-приветствовать идею написания книги, выразить моральную поддержку и пожелать творческих успехов.

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

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

Возможно стоит вынести код не в отдельный поток а в отдельное небольшое консольное приложение.
...
Рейтинг: 0 / 0
Многопоточное программирование в Delphi для начинающих
    #39986862
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roschinspb,
Спасибо за предложения! Я их проанализирую и постараюсь отразить в статье.
...
Рейтинг: 0 / 0
Многопоточное программирование в Delphi для начинающих
    #39986899
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roschinspb,

Сереж, у тебя же на "народе" небольшая статья была с примерами потоков...
...
Рейтинг: 0 / 0
Многопоточное программирование в Delphi для начинающих
    #39986945
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roschinspb,

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


я бы не сказал, что так уж сложно и на порядок. достаточно придерживаться известных принципов: не лезть к vcl и к расшаренным ресурсам и в 99% случаев всё сразу же заработает. невизуальные компоненты, имеющие проблемы в многопоточке - скорее исключение.
долгие вычисления как правило предполагают много данных и гонять данные между приложениями в обе стороны - то еще удовольствие
...
Рейтинг: 0 / 0
Многопоточное программирование в Delphi для начинающих
    #39986952
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

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

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

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

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


это скорее исключение.
А в целом - гораздо полезнее разобраться с потоками, чем с межпроцессным взаимодействием.
...
Рейтинг: 0 / 0
Многопоточное программирование в Delphi для начинающих
    #39987001
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r,

полезнее знать что делать, когда программа виснет в чужой dll и никакие потоки не спасают, т.к. их не перезапустить...
...
Рейтинг: 0 / 0
Многопоточное программирование в Delphi для начинающих
    #39987022
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius
makhaon,

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

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


К сожалению, межпроцессное взаимодействие это не та задача, которая возникает у большинства Delphi-программистов каждый день. В RTL, если не ошибаюсь, нет практически ничего готового в помощь для решения этой задачи (я не говорю о взаимодействии по TCP или через COM, тут как раз более менее всё необходимое имеется). Если возникает задача организовать взаимодействие между процессами в рамках одного компьютера, то, думаю, каждый Delphi-программист вынужден мастерить свой велосипед.
...
Рейтинг: 0 / 0
Многопоточное программирование в Delphi для начинающих
    #39987026
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roschinspb,

а где предложение про Окно, отображающее ход выполне­ния длительной операции ? :)
Было бы уместным!
С ним кстати не было проблем/сбоев? Работает во всех версиях Delphi?
...
Рейтинг: 0 / 0
Многопоточное программирование в Delphi для начинающих
    #39987029
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так или иначе, "учебник" в первую очередь о том, как научиться многопоточному программированию в Delphi (в идеале, для решения различных задач, где уместна многопоточность), а не о том, как решать различные задачи, не прибегая к многопоточному программированию.
...
Рейтинг: 0 / 0
Многопоточное программирование в Delphi для начинающих
    #39987080
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius
Vizit0r,

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


это уже сильно частные случаи, на самом деле.
...
Рейтинг: 0 / 0
Многопоточное программирование в Delphi для начинающих
    #39987164
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
roschinspb,

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

Для начинающих пример сложноват. Это скорее для второго тома. Многопоточное программирование для тех, кто бросает. 😁. Вообще на сайте не последняя версия. Последняя с исправлениями для 64 бит погибла вместе с винчестером. Когдато яя её кому-то выслал, может где и есть еще.
...
Рейтинг: 0 / 0
Многопоточное программирование в Delphi для начинающих
    #39987213
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon
невизуальные компоненты, имеющие проблемы в многопоточке - скорее исключение

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

makhaon

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

P.S. Я не призываю отказаться от тредов вообще и не надо меня убеждать в том что иногда они нужны. Я просто пытаюсь избавить от лишних проблем начинающих программеров и тех кто потом за ними будет код чистить.
...
Рейтинг: 0 / 0
Многопоточное программирование в Delphi для начинающих
    #39987286
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так вот кто гуглу насоветовал про процессы, так что теперь хром плодит свои копии интенсивней, чем зерглинги вылупляются!
...
Рейтинг: 0 / 0
25 сообщений из 160, страница 4 из 7
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Многопоточное программирование в Delphi для начинающих
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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