1. 程式人生 > >解決 Windows has triggered a breakpoint in Linkage.exe問題

解決 Windows has triggered a breakpoint in Linkage.exe問題

這兩天在做一個小專案,裡面有多執行緒的東東,在除錯的時候 總是遇到 Windows has triggered a breakpoint in Linkage.exe 的錯誤。現在將這個問題和大家分享一下。

前提是這樣的:

我要從資料庫裡面查詢裝置,然後找了一組裝置之後,就要迴圈開啟每一個的連線:

for (int i=0;i<records;i++)	//records代表記錄集條數
			{
				CString strCameraID;
				strCameraID=CString(Anita::UTF8Tostring((char*)LResult.rows[i][0].c_str()).c_str());
				TDev* p = new TDev; //TDev 是我的裝置結構體
				strcpy_s(p->id, Anita::UTF8Tostring((char*)LResult.rows[i][0].c_str()).c_str());
                                p->StartThread();
                        }


開啟每一個連線的過程就是一個開啟“執行緒”的過程,因為這個執行緒要負責 不停的重連裝置,保證裝置線上。。
bool StartThread()
	{
		m_bStart = true;
		m_pWorkerThread = AfxBeginThread(TDev::ProcessThreadProc, (void*)this,
			THREAD_PRIORITY_NORMAL);
		if(!m_pWorkerThread)
			return false;
		return true; 
	}
執行緒函式如下:

static UINT ProcessThreadProc(LPVOID pParam)
	{
		TDev* pThis = reinterpret_cast<TDev*>(pParam);
		::OleInitialize(NULL);
		while(pThis->m_bStart)
		{
			pThis->Work();					
			Sleep(30);
		}
		::CoUninitialize();
		TRACE("EXIT THREAD");	
		return 0xdead;
	}

按理說,這樣是沒有什麼問題的,先查詢裝置集合,然後一個一個地開啟執行緒開啟裝置連線。

可是在除錯的時候,時不時地彈出一個錯誤:

注意不是每回都彈出這個問題,是時不時地彈出!

開始的時候我也一頭霧水,還以為是別的什麼庫出了問題,找老大去說,他也隨便說了說。於是我還得自己找不是.

後來我經過測試發現,一開始不彈出這個heap corruption 的情況下,系統執行的都好好的,所以問題很有可能就出在最開始了,是不是開啟執行緒的時候就發生衝突了呢?

最後,我終於有了些發現,我那個執行緒函式那裡找到了這句:

pThis->Work();					
		             Sleep(30);
這個 Sleep(30);很重要啊,它給了我靈感..

執行緒的開啟需要申請地址等等,我的資料集合那邊的那個迴圈是不等待的(理論上)啊,這樣一來第一個還沒開始執行,第二個又開始了,假如後面的執行緒來申請地址或開始work的時候,前面的正好也在處理記憶體,這樣不就發生衝突了嘛?

於是我就在我的那個資料集迴圈那裡也來一個Sleep(),果然,這個問題就再也沒有彈出過。

至於此處應該Sleep()多久,我就寫了30毫秒,最好預留一些時間給CPU處理吧,30毫秒我想奔三也應該夠了吧。。

修改的程式碼:

for (int i=0;i<records;i++)	//records代表記錄集條數
			{
				CString strCameraID;
				strCameraID=CString(Anita::UTF8Tostring((char*)LResult.rows[i][0].c_str()).c_str());
				TDev* p = new TDev; //TDev 是我的裝置結構體
				strcpy_s(p->id, Anita::UTF8Tostring((char*)LResult.rows[i][0].c_str()).c_str());
				p->StartThread();
				Sleep(30);//開啟執行緒需要時間, 30毫秒 給 CPU,奔三也應該夠了吧?!
}

經過測試,我的問題解決了。至於文中的原理是不是完全正確,希望大家多提意見..