2013-03-20 4 views
0

Мне нужно отправить код, который будет запускаться в потоке, который выполняет перекачку сообщений, без, определяя несколько пользовательских сообщений.
Что-то вроде Java SwingUtilities.invokeLater() (Примечание: я уже есть утилита, которая позволяет лямбда быть callbackable)Код запуска в потоке пользовательского интерфейса

Я уже пробовал ::SendMessageCallback & SendAsyncProc, но обратного вызова вызывается одним и тем же отправителем поток, когда он вызывает ::GetMessage (т.е. требование для этого api ...)

ATM моя альтернатива заключается в том, чтобы определить пользовательское сообщение (то есть WM_USER_EXECUTE), на которое передается обратный вызов, но для этого требуется, чтобы все целевые объекты были готовы принять это сообщение! Я бы предпочел более общий способ.

+1

QueueUserAPC()? –

+0

@ Мартин, я расследую, спасибо на данный момент, я не знал, что api – MrAduer

+0

@Martin Argh! это делает работу. После того, как APC была поставлена ​​в очередь, ничего не происходит до тех пор, пока поток получателя не войдет в альтернативное состояние (например, вызовом SleepEx с bAlertable TRUE) Очевидно, что внутренности :: GetMessage не оставляют поток в таком состоянии :( – MrAduer

ответ

0

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

  1. Получить безопасный идентификатор сообщения с RegisterWindowMessage() (может быть параноидальной, но механизм полностью прозрачном для целей ..)
  2. Получить идентификатор потока целевого окна от его HWND с GetWindowThreadProcessId
  3. Установить hook with ::SetWindowsHookEx, параметризованный с помощью WH_CALLWNDPROC
  4. Внутри процедуры hook игнорируются все сообщения, кроме нашего специального.
    Когда что MSG найден, запустите функцию обратного вызова осуществляется с wParam'а,
  5. Trigger все это с SendMessage передавая специальный идентификатор сообщения и указатель на подпрограмму, которая содержит код, который будет выполняться

Все может быть воплощен в функции и используется как invokeOnWndProc (HWND, lambda_Callback)

PROS: код работает в потоке пользовательского интерфейса, полностью прозрачен, синхронно!
CONS: вполне тяжеловес ..

Смежные вопросы