這幾天在windows和android平臺上都使用了線程,雖然實現的很簡單,但還是因爲不熟悉導致了一些crash
Tips:
1 線程裏不要對成員變量賦值,並用這個賦值作爲線程終止條件;
2 在關閉線程的時候,需要等待線程終止,也就是說必需滿足線程函數終止條件,沒有條件要創造條件;
3 在CreateProc的時候有個默認參數是分配內存大小,以前有遇到過默認內存不夠的情況,需要改變這個值。
windows
創建線程
m_hPreviewShowThread = ::CreateThread(NULL,0,PreviewShowProc,this,0,NULL);
if(!<span style="font-family: Arial, Helvetica, sans-serif;">m_hPreviewShowThread</span>)
{
//線程啓動失敗
hr = E_FAIL;
LOG_ERR(L"VideoService Create PreviewShowProc Thread failed.");
}
DWORD WINAPI VideoService::PreviewShowProc(LPVOID lp)
{
HRESULT hr = S_OK;
LOG_INFO(L"PreviewShowProc start.");
VideoService *pVideoService = (VideoService *)lp;
CHECK_IF_NULL(pVideoService);
while(1)
{
if(pVideoService->m_previewRenderCallback->m_frameCnt>=1)
{
LOG_INFO(L"preview received data");
pVideoService->NotifyToShowPreviewWindow(TRUE);
break;
}
if(!pVideoService->m_bPreviewed)
break;
Sleep(50);
}
LOG_INFO(L"PreviewShowProc end.");
exit:
return 0;
}
線程終止 if(m_hPreviewShowThread!=NULL)
{
DWORD dRet = WaitForSingleObject(m_hPreviewShowThread,WAITTHREAD_TIMEOUT);
if(dRet == WAIT_OBJECT_0)
{
LOG_INFO(L"VideoService preview monitor wait thread to exit successfully");
CloseHandle(m_hPreviewShowThread);
m_hPreviewShowThread = NULL;
m_previewRenderCallback->m_frameCnt = 0;
}
else
{
LOG_ERR(L"wait preview monitor thread exit failed with error:[%d]",dRet);
hr = E_TANG_VIDEO_WAIT_THREAD_FAILED;
}
}