Piaggio, Twoim zadaniem jest dostarczenie wystarczających i zwięzłych informacji. Trzeba napisać co i jak robisz, albo wkleić kawałki kodu w których widać jak coś robisz.
Kod który podałeś, u mnie wchodzi do normalnego stanu natychmiast po uruchomieniu. W funkcji Funkcja musisz robić coś, co blokuje oba wątki. Albo to nam pokażesz co takiego robi Funkcja, albo w debuggerze wyłap moment zawieszenia się programu i zerknij na czym wiszą oba wątki, w jakich funkcjach (callstack), oraz jaki ostatni LOG wypluła funkcja Funkcja:
OutputDebugString("wysyłam komunikat xx"); // albo dprintf(...); z dprintf.h
SendMessage();
OutputDebugString("gotowe");
Albo lepiej:
if (!SendMeesageTimeout(hwnd,xx,wparam,lparam,SMTO_ABORTIFHUNG,5000,&result))
MessageBox(0, "Funkcja: okno nie odpowiada na komunikat xx",0,0)
Niekiedy lepiej jest użyć funkcji QueueUserAPC() by uruchomić dowolną funkcję w kontekście dowolnego wątku, niż wysyłać komunikaty z pobocznego wątku. Jednak wymaga to przerobienia pętli z GetMessage na cos całkiem innego: MsgWaitForMultipleObjectsEx (poniżej). Czasem taka przeróbka znacznie przyspiesza wysłanie serii komunikatów z pobocznego wątku.
HANDLE g_hMainThread;
main()
{
DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(),
&g_hMainThread, 0, FALSE, DUPLICATE_SAME_ACCESS);
// otwórz okno
HANDLE hEvent = CreateEvent(0,0,0,0);
while (okno jest otwarte)
{
DWORD status = MsgWaitForMultipleObjectsEx(1, &hEvent, 5000, QS_ALLINPUT, MWMO_ALERTABLE);
if (status == 1)
{
while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
// if !TranslateAccelerator ... !IsDialogMessage ... !TranslateMDISysAccel
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
CloseHandle(hEvent);
CloseHandle(g_hMainThread);
//Dodanie APC do kolejki: (z pobocznego wątku)
QueueUserAPC((PAPCFUNC)APCProc1, g_hMainThread, parametr);
// czekaj na wykonanie?
// if (WaitForSingleObject(parametr->hEvent, czas) == WAIT_TIMEOUT) error("...");
VOID CALLBACK APCProc1(JAKAS_STRUKTURA *parametr)
{
// to się wykonuje w kontekście głównego wątku
... cośtam
// potwierdź zakończenie?
// SetEvent(parametr->hEvent);
}