CRITICAL_SECTION cs;
HANDLE hStopEvent;
HANDLE hThread;
+ DWORD threadId;
UINT uTimer;
/* data for playing the file */
int nFromFrame;
HANDLE handle = infoPtr->hThread;
TRACE("stopping animation thread\n");
+ infoPtr->hThread = 0;
SetEvent( infoPtr->hStopEvent );
- LeaveCriticalSection(&infoPtr->cs); /* leave it a chance to run */
- WaitForSingleObject( handle, INFINITE );
- TRACE("animation thread stopped\n");
- EnterCriticalSection(&infoPtr->cs);
- CloseHandle( infoPtr->hThread );
+
+ if (infoPtr->threadId != GetCurrentThreadId())
+ {
+ LeaveCriticalSection(&infoPtr->cs); /* leave it a chance to run */
+ WaitForSingleObject( handle, INFINITE );
+ TRACE("animation thread stopped\n");
+ EnterCriticalSection(&infoPtr->cs);
+ }
+
+ CloseHandle( handle );
CloseHandle( infoPtr->hStopEvent );
- infoPtr->hThread = 0;
+ infoPtr->hStopEvent = 0;
}
if (infoPtr->uTimer) {
KillTimer(infoPtr->hwndSelf, infoPtr->uTimer);
LeaveCriticalSection(&infoPtr->cs);
/* time is in microseconds, we should convert it to milliseconds */
- if (WaitForSingleObject( event, (timeout+500)/1000) == WAIT_OBJECT_0)
+ if ((event == 0) || WaitForSingleObject( event, (timeout+500)/1000) == WAIT_OBJECT_0)
break;
}
return TRUE;
/* create a timer to display AVI */
infoPtr->uTimer = SetTimer(hWnd, 1, infoPtr->mah.dwMicroSecPerFrame / 1000, NULL);
} else {
- DWORD threadID;
-
if(GetWindowLongA(hWnd, GWL_STYLE) & ACS_TRANSPARENT)
{
infoPtr->hbrushBG = (HBRUSH)SendMessageA(infoPtr->hwndNotify,
TRACE("Using an animation thread\n");
infoPtr->hStopEvent = CreateEventW( NULL, TRUE, FALSE, NULL );
- infoPtr->hThread = CreateThread(0,0,ANIMATE_AnimationThread,(LPVOID)infoPtr, 0, &threadID);
+ infoPtr->hThread = CreateThread(0,0,ANIMATE_AnimationThread,(LPVOID)infoPtr, 0, &infoPtr->threadId);
if(!infoPtr->hThread)
{
ERR("Could not create animation thread!\n");