在MFC中,向線程傳遞CString變量參數時,很容易犯一個錯誤,就是使用一個超出生存期的變量,在主函數中定義的CString變量是局部變量,當主函數結束時,這個CString變量就會被析構,而卻在另一個線程中繼續使用,參數傳遞就會出現問題。
解決此問題,可以在主函數中new一個CString,在線程結束時在delete一下釋放內存。或者聲明一個全局變量,保證CString變量不會超出生存期,這樣傳遞進線程的參數就可以正常使用了。
CString只保證類級的線程安全,
要做到對象級別的線程安全,需要你自己進行同步, 也就是說, 可以同時有N個線程在讀, 但是寫的時候,必須保證沒有任何線程"正在"讀和寫 才可以寫入.
1 CString str;
2
3 CCriticalSection cs;
4 cs->Lock( );
5 str+="abcdefg";
..
6 do anything you want
7 cs->Unlock( );
線程傳遞char*
1 DWORD WINAPI test::ProcessNotifyThread(LPVOID pParam)
2 {
3
4 char *pSectionName = (char *)lpvoid;
5 CString sSectionName;
6 sSectionName.Format("%s", pSectionName); return 0 ;
7 }
8
9 void test::OnBnClickedButton1()
10 {
11 // TODO: Add your control notification handler code here
12 CString str = _T("aaaa");
13 const char *pSectionName = (LPCTSTR)str;
14 CWinThread* pThread = AfxBeginThread((AFX_THREADPROC)test::ProcessNotifyThread, (LPVOID)pSectionName);
15 }