Re: AfxThread question
"kathy" <yqin_99@yahoo.com> wrote in message
news:1146249967.382180.310820@i40g2000cwc.googlegroups.com...
I have a piece of code:
...
m_data.sThreadType = _T("Client1");
CWinThread* clientThread1 =
AfxBeginThread(ClientThreadFunction,(LPVOID)&m_data);
::Sleep(1);
m_data.sThreadType = _T("Client2");
CWinThread* clientThread2 =
AfxBeginThread(ClientThreadFunction,(LPVOID)&m_data);
...
UINT CDialog_MFC_WorkThread::ClientThreadFunction(LPVOID pParam)
{
ThreadData* pData = (ThreadData*) pParam;
CString cs = pData->sThreadType;
if(cs == _T("Client1"))
m_CListBox_Client1.AddString(_T("in ClientThreadFunction()"));
else if(cs == _T("Client2"))
m_CListBox_Client2.AddString(_T("in ClientThreadFunction()"));
return 0;
}
it runs OK.
BUT, If I comment out the Sleep(1), I set break point at:
m_CListBox_Client1.AddString(_T("in
ClientThreadFunction()"));
It never breaks. Why?
You're lucky that it "runs OK". The call to Sleep(1) will cause the GUI
thread to relinquish its thread-slice, but there's no guarantee that Thread1
will be scheduled before the GUI thread gets another time-slice, overwrites
the contents of m_data, and starts up Thread2.
Create "new'd" ThreadData structures on the heap, one for each thread, and
let the thread be responsible for "delete'ing" them:
ThreadData* pTD = new ThreadData;
pTD->sThreadType = _T("Client1");
CWinThread* clientThread1 =
AfxBeginThread(ClientThreadFunction,(LPVOID)pTD);
/// sleep not required ::Sleep(1);
pTD=new ThreadData;
pTD->sThreadType = _T("Client2");
CWinThread* clientThread2 =
AfxBeginThread(ClientThreadFunction,(LPVOID)pTD); // pass-by-value will
ensure that thread1 will not get an incorrect value of pTD
....
UINT CDialog_MFC_WorkThread::ClientThreadFunction(LPVOID pParam)
{
ThreadData* pData = (ThreadData*) pParam;
// ... use pData the way you want, but DON'T TOUCH THE GUI OF THE MAIN
THREAD
delete pData;
}
Mike