проблема посттекстового сообщения и peekmessage в Delphi 2006 - PullRequest
1 голос
/ 17 сентября 2009

Я создал многозарядное приложение. Окна приложения (W [n]: TMyWindows) одинаковы, и все они имеют связанный с ними экземпляр класса закрытого объекта (E: TMyObject). Дочерние окна генерируют через эти объекты несколько сообщений. В основном приложении я создал два потока, которые обрабатывают эти сообщения в зависимости от содержания сообщений. Например, давайте иметь следующие асинхронные вызовы:

W[1].E.Service(thread1service)
W[2].E.Service(thread2service)

Сервис TMyObject.Service (тип обслуживания) равен

case servicetype of
  thread1service: PostThreadMessage(thread1id,...);
  thread2service: PostThreadMessage(thread2id,...);
end;

Теперь в методе выполнения каждого потока у меня есть что-то вроде этого:

while not terminated do
begin
 ...
 if peekmessage(msg,0,thread1message_1,thread1message_n,pm_remove) then
      process message
 do other things;
end

Все идет хорошо, за исключением того, что второй поток не получает никаких сообщений. У вас есть идеи, почему?

Ответы [ 3 ]

1 голос
/ 18 сентября 2009

Я бы проверил, что диапазон, который вы вводите для PeekMessage(), действителен. Попробуйте вместо этого ввести нули, чтобы получить все сообщения, например:

PeekMessage(msg, 0, 0, 0, PM_REMOVE)

Если это не сработает, я бы проверил результат функции PostThreadMessage() ... Может быть, поток еще не вызвал PeekMessage(), вот что побуждает Windows создать очередь сообщений для вас .

Как указано в этой статье (в разделе «Замечания»), вы можете либо проверить результат вызова на PostThreadMessage(), либо Sleep() в случае сбоя, либо использовать событие для подачи сигнала основной поток, который дочерний поток готов принимать сообщения.

НТН,

N @

0 голосов
/ 04 апреля 2012

Я знаю, что это старый вопрос, но у меня только что была похожая проблема в нашем коде. Мы запускаем Delphi 2006 на 64-разрядной версии Win 7, и в рассматриваемом коде используется библиотека DLL, взаимодействующая с отдельным приложением посредством peekmessage / postthreadmessage.

Мне удалось отследить проблему до прав администратора, предоставляемых либо приложению, либо Delphi. Режим совместимости также приводит к появлению проблемы, так как для этого требуются права администратора. Если права администратора предоставлены, поток администратора может связаться с потоком, не являющимся администратором, но поток, не являющийся администратором, не сможет затем отправить сообщение обратно в поток с правами администратора. Вызов PostThreadMessage в приложении, не являющемся администратором, сообщал об успешном выполнении, но сообщение так и не появилось в очереди сообщений целевого приложения.

Я не решил проблему, но, к счастью, смог запустить приложение в обычном режиме, так что это не было проблемой, кроме потерянного времени в его поиске.

0 голосов
/ 20 сентября 2009

Итак, мне пришлось сдаться, поскольку я не нашел никакого рационального объяснения.

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

...