Zhiguo wrote:
HI, all of you,
I have created a Win32 console project with MFC support(shared dll) to
test my multithread programming.
When run, a "Debug assertion failure" occures at the following
expression:
_ASSERTE(_CrtIsValidHeapPointer(pUserData));
I cannot figure out why the exception occurs. Can you shed some light
on me?
Any help appreciated. Thansk in advance.
^_^
The only source file is as follows:
//--------------------------------------------------
#include <afx.h>
#include <afxmt.h>
#include <afxwin.h>
#include <windows.h>
#include <iostream>
using namespace std;
class CTestThread: public CWinThread{
public:
CTestThread(){}
virtual ~CTestThread(){}
int Run(){
cout << "run..." << endl;
return 1;
}
BOOL InitInstance(){
cout << "init..." << endl;
return TRUE;
}
int ExitInstance(){
cout << "exit inst..." << endl;
return 0;
}
};
int main(){
int nWorkerNum = 2;
CTestThread * m_pThread = new CTestThread[nWorkerNum];
HANDLE * m_pThreadHandle = new HANDLE[nWorkerNum];
for(int i = 0; i < nWorkerNum; i ++){
m_pThread[i].CreateThread();
m_pThreadHandle[i] = m_pThread[i].m_hThread;
}
WaitForMultipleObjects(nWorkerNum, m_pThreadHandle, TRUE, INFINITE);
cout << "Press any key to conitnue..." << endl;
char c; cin >> c;
}
//--------------------------------------------------
When you exit from the thread CWinThread normally does
delete this;
If the thread runs and exits very quickly this makes your
m_pThread[i].m_hThread use an invalid pointer.
You can avoid this problem like this:
m_pThread[i].CreateThread(CREATE_SUSPENDED);
m_pThread[i].m_bAutoDelete = FALSE;
m_pThreadHandle[i] = m_pThread[i].m_hThread;
m_pThread[i].ResumeThread();
With this change you also should delete m_pThread[i] after
WaitForMultipleObjects returns.
--
Scott McPhillips [MVP VC++]
It works. Thank you very much!