Как отправить сообщение на TThread из основного потока в Delphi? - PullRequest
8 голосов
/ 08 ноября 2008

Я хочу отправить сообщение в ветку и обработать ее в ветке. Как я могу сделать это в Delphi? Я думаю, PostMessage - это путь, но примеры, которые я видел до сих пор, описывают другой путь, то есть от потока к основному потоку.

Ответы [ 3 ]

6 голосов
/ 08 ноября 2008

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

Более общим решением является очередь производитель-потребитель, которая в классической реализации использует пару семафоров для отслеживания потребителей и производителей и третий семафор для взаимоисключающего доступа к очереди; однако в сети доступны более оптимальные очереди производитель-потребитель.

6 голосов
/ 08 ноября 2008

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

3 голосов
/ 08 ноября 2008

Зачем вам это нужно? Только по одной причине мне когда-либо приходилось создавать цикл сообщений во вторичном потоке, а именно потому, что поток использовал COM-объекты. Вызовы OleInitialize () и OleUnitialize () являются признаком того, что вам нужен стандартный GetMessage () цикл. В этом случае также необходимо просто публиковать сообщения в этой теме, используя PostThreadMessage () , потому что обычные блокирующие вызовы синхронизации будут мешать работе цикла сообщений. В противном случае, просто не делайте этого.

Если вы находитесь на Delphi 2007 или 2009, обязательно загляните в OmniThreadLibrary от Primož Gabrijelčič, это должно значительно облегчить вашу работу.

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