在MFC中,向線程傳遞CString變量參數(shù)時(shí),很容易犯一個(gè)錯(cuò)誤,就是使用一個(gè)超出生存期的變量,在主函數(shù)中定義的CString變量是局部變量,當(dāng)主函數(shù)結(jié)束時(shí),這個(gè)CString變量就會(huì)被析構(gòu),而卻在另一個(gè)線程中繼續(xù)使用,參數(shù)傳遞就會(huì)出現(xiàn)問題。
解決此問題,可以在主函數(shù)中new一個(gè)CString,在線程結(jié)束時(shí)在delete一下釋放內(nèi)存。或者聲明一個(gè)全局變量,保證CString變量不會(huì)超出生存期,這樣傳遞進(jìn)線程的參數(shù)就可以正常使用了。
CString只保證類級(jí)的線程安全,
要做到對(duì)象級(jí)別的線程安全,需要你自己進(jìn)行同步, 也就是說, 可以同時(shí)有N個(gè)線程在讀, 但是寫的時(shí)候,必須保證沒有任何線程"正在"讀和寫 才可以寫入.
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 }