Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

Правка 2:

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

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

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top