Перекрестная связь в Delphi - PullRequest
6 голосов
/ 13 января 2009

Есть ли документация по межпоточному взаимодействию в Delphi? Как я могу отправить сообщение в ветку, у которой нет окна?

Ответы [ 3 ]

11 голосов
/ 13 января 2009

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

Однако нет необходимости использовать сообщения для связи с потоком. Просто дайте ему подождать на объекте события (TEvent в VCL) и сообщите об этом событии, когда вы хотите, чтобы поток выполнил функцию.

Но если вы новичок в многопоточности - не вдавайтесь во все эти подробности самостоятельно, если только вы не хотите обучающего эффекта. Просто используйте OmniThreadLibrary и покончите с этим. Изучив его внутренности, можно многому научиться, если вы знаете, как им пользоваться.

Edit:

См. Также ответы на этот вопрос , который очень похож.

Редактировать 2:

Относительно комментария, спрашивающего: «Что [OmniThreadLibrary] делает проще и по какой цене?» Я могу только посоветовать вам проверить это для себя - то есть, если вы используете хотя бы Delphi 2007. Есть несколько примеров для иллюстрации концепций, но для быстрого «реального» примера вы могли бы взглянуть на это сообщение в блоге - вам даже не нужно устанавливать библиотеку для этого.

Я также согласен с тем, что использование библиотеки для многопоточности требует определенного акта веры. OTOH делает то, что обеспечивает VCL, вряд ли является альтернативой. В примере кода все еще используется непродуманный вызов Synchronize (). Отсутствует поддержка таких вещей, как поточно-ориентированные очереди производителей-потребителей, которые гораздо больше подходят для многопоточного программирования. И если вы согласны с тем, что вам нужна более прочная основа для многопоточных программ, чем VCL, - зачем изобретать это колесо?

Что касается стоимости использования библиотеки: вам придется самим определять время, достаточно ли быстро для вас. ИМХО, он хорошо абстрагирует связь между потоками, но каждая абстракция, очевидно, требует производительности.

Если вы решите, что это не для вас - напишите код самостоятельно. Я сделал то же самое для Delphi 4 и использую этот код уже почти 10 лет. И, судя по количеству найденных ошибок и угловых случаев, с которыми я столкнулся за это время, я бы определенно посоветовал любому новичку в многопоточности , а не написать свой собственный код библиотеки для него. И если вы действительно очень хотите, пожалуйста, примите правила в этой публикации близко к сердцу.

3 голосов
/ 13 января 2009

Вопрос Цикл многопоточных сообщений Delphi также содержит несколько примеров взаимодействия между потоками

0 голосов
/ 13 января 2009

Если у вас есть ссылка на объект потока, вы можете просто вызвать его напрямую и заставить процедуру хранить информацию или обновлять ее соответствующим образом. Очевидно, что вы должны быть осторожны, чтобы делать что-то потокобезопасным образом.

В качестве альтернативы, вы можете использовать центральный объект управления, через который потоки взаимодействуют, когда они не заняты. У меня есть приложение, где потоки имеют конкретные цели, и выделяется идентификатор потока. Любой поток может «опубликовать» сообщение с идентификатором сообщения и строкой параметров для другого идентификатора потока, а затем продолжить работу. Другой поток берет его на досуге и действует соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...