線程的創建與終止


這幾天在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;
		}
	}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章