2009-01-16 10 views
5

Moje pytanie brzmi: w jaki sposób można użyć funkcji SendMessage() do implementowania komunikacji wątków między dwoma wątkami, jeden z oknem (GUI), a drugi bez okna?Komunikacja między wątkami za pomocą funkcji SendMessage

Problem polega na tym, że funkcja SendMessage() potrzebuje klamki (HWND)?

Kolejny szczegół o moim projekcie: dwa wątki, jeden bieg kodu zarządzanego (jednej z interfejsem użytkownika), a drugi działa kod natywny (jeden bez okna)

Dziękuję bardzo!

+0

SendMessage jest niezwykle niebezpieczna funkcja do korzystania w środowisku wielowątkowym, ponieważ nie jest bezpieczny wątku i może doprowadzić do zakleszczenia (mówię z doświadczenie). –

Odpowiedz

3

Może powinieneś spróbować użyć PostMessage lub PostThreadMessage

+0

Bardzo lubię PostThreadMessage. Czy istnieje blokująca wersja tej funkcji? Ponieważ PostThreadMessage zwraca się bez czekania, aż wywoływacz przetworzy wiadomość. –

+0

Nie. Wdrożenie wersji blokującej nie byłoby zbyt trudne - użyj PostThreadMessage, a następnie zablokuj wątek wywołujący zdarzenie, które ustawi wywołujący, gdy przetworzy wiadomość –

2

Jeśli nić nie ma okien, nie ma kolejki komunikatów, a nie wiadomość dyspozytora, to będzie trudne do wiadomości do niego. Często wątki tworzą ukryte okna tylko w celach komunikacyjnych (spójrz na Windows Spy, a zobaczysz mnóstwo przykładów).

Jedną z alternatyw jest użycie pamięci współużytkowanej i prymitywu synchronizacji takiego zdarzenia lub semafora. Inną alternatywą jest użycie rur.

2

co @jdigital powiedział. Zauważ, że jeśli utworzysz ukryte okno, a twój wątek jeszcze nie zaimplementuje pętli komunikatów (albo w zwykłym słowie win32-speak, albo w kontekście STA COM - i jeśli nie masz pojęcia o czym mówię wtedy prawdopodobnie nie ma w twoim wątku), będziesz również chciał utworzyć pętlę wiadomości. ATL czyni to dość łatwym z _AtlModule.RunMessageLoop(); Niestety to również oznacza, że ​​wątek, o którym mowa, prawdopodobnie będzie musiał być sterowany zdarzeniami, gdy znajduje się w pętli wiadomości. Możesz robić trudne rzeczy, takie jak MsgWaitForMultipleObjects, ale robi się włochaty.

Oto przykład hidden windows, jeśli znasz ATL/COM. Przeszedłem przez ten ból jakiś czas temu i pomyślałem, że była pożyteczna dyskusja na temat microsoft.public.vc.atl, ale najlepsze, co mogę teraz znaleźć, to this post. który szczegółowo opisuje warianty pętli komunikatów (co robić inaczej, jeśli masz akceleratory klawiszy lub niemodne okna, brzmi jak nie masz w aplikacji).

Powiązane problemy