C++,在线程中调用类的成员函数,为何数据偶尔会出错,偶尔就是对的
C++,在线程中调用类的成员函数,为什么数据偶尔会出错,偶尔就是对的?
线程是在这里面创建的
void CSocketThread::CreateSocketThread()
{
m_hThread = (HANDLE)_beginthreadex(NULL,0,ClientThread,this,0,NULL);
Sleep(1000);
if (m_hThread == NULL)//如果线程创建失败
{
printf("创建线程失败:%d\n",WSAGetLastError());
}
}
unsigned int WINAPI ClientThread(LPVOID lpParam)
{
CSocketThread *pSocketThread = (CSocketThread*)lpParam;//这里转换的时候显示成员变量的值不变
CMainWin *pMainWin = pSocketThread->Get_pMainWin();//偶尔出错
ECOMMUNICATETYPE eKind = pSocketThread->Get_eCommunicateType();////偶尔出错
char* chrRecBuffer = pSocketThread->GetRevBuf();//偶尔出错
}
------解决方案--------------------
MFC 不是很适合多线程,MFC不是多线程安全的。
1)需要加锁
2)需要重构。
那些和界面相关的东西,不适宜用在线程里;
包括 SetWindowText 等使用SendMessage的函数,和一些类似的API。
3)界面线程,不适合长期锁住,或者Sleep 。
界面线程无论是,Sleep,还是加锁,都可能会影响界面刷新。
线程是在这里面创建的
void CSocketThread::CreateSocketThread()
{
m_hThread = (HANDLE)_beginthreadex(NULL,0,ClientThread,this,0,NULL);
Sleep(1000);
if (m_hThread == NULL)//如果线程创建失败
{
printf("创建线程失败:%d\n",WSAGetLastError());
}
}
unsigned int WINAPI ClientThread(LPVOID lpParam)
{
CSocketThread *pSocketThread = (CSocketThread*)lpParam;//这里转换的时候显示成员变量的值不变
CMainWin *pMainWin = pSocketThread->Get_pMainWin();//偶尔出错
ECOMMUNICATETYPE eKind = pSocketThread->Get_eCommunicateType();////偶尔出错
char* chrRecBuffer = pSocketThread->GetRevBuf();//偶尔出错
}
C++线程,成员函数
------解决方案--------------------
MFC 不是很适合多线程,MFC不是多线程安全的。
1)需要加锁
2)需要重构。
那些和界面相关的东西,不适宜用在线程里;
包括 SetWindowText 等使用SendMessage的函数,和一些类似的API。
3)界面线程,不适合长期锁住,或者Sleep 。
界面线程无论是,Sleep,还是加锁,都可能会影响界面刷新。