Czyli komunikaty powinny rozwiązać mój problem?
Tak.
const char MY_CLASS_NAME[] = "Unikatowa nazwa dla mojej klasy handlera komunikatow";
const char MY_MESSAGE_NAME[] = "Unikatowa nazwa dla mojego komunikatu";
const UINT MY_MESSAGE = RegisterWindowMessage(MY_MESSAGE_NAME);
HWND hMessageHandler;
LRESULT CALLBACK MessageHandlerProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == MY_MESSAGE) {
JakasStruktura *struktura = (JakasStruktura*)lParam;
Funkcja(struktura);
delete struktura;
}
/* .. ewentualne inne komunikaty ... */
}
void Funkcja(JakasStruktura* struktura)
{
/* ... jesteśmy w wątku głównym ... */
/* ... coś tam sobie robimy ze 'struktura' ... */
}
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
JakasStruktura* str = new JakasStruktura;
str->jakiespole = 1;
/* ... reszta pól ... */
PostMessage(hMessageHandler, MY_MESSAGE, 0, (LPARAM)str);
}
BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID lpReserved)
{
WNDCLASSEX wndclass;
ZeroMemory(&wndclass, sizeof(wndclass));
wndclass.cbSize = sizeof(wndclass);
wndclass.lpfnWndProc = MessageHandlerProc;
wndclass.lpszClassName = MY_CLASS_NAME;
RegisterClassEx(&wndclass);
hMessageHandler = CreateWindow(MY_CLASS_NAME, "", 0, 0, 0, 0, 0, HWND_MESSAGE, 0, 0, NULL);
CreateThread(0, NULL, ThreadProc, NULL, NULL, NULL);
}
vpiotr napisał(a)
ale to wymaga skanowania po stronie głównego wątku.
No właśnie to jest sedno problemu, a nie synchronizacja.
// EDIT
To może nie działać w dwóch sytuacjach:
- gdy "aplikacja" jakoś dziko obsługuje komunikaty, może zablokować twój komunikat
- gdy "aplikacja" ładuje wtyczkę z niegłównego wątku
Jeśli problemem będzie jedno lub drugie to można spróbować z Asynchronous Procedure Calls.