一个子线程里的窗口不能使用主线程里消息收发处理,必须在子线程里追加消息收发处理。继承CWinThread类可以实现消息收发处理。以下是编程测试笔记。
1.创建线程类。从CWinThread派生CTestThread类。CTestThread();上面的protected:改成public:。为了简单起见,在重载的InitInstance()函数里,创建一个简单的CFrameWnd类,并显示其窗口。
// CTestThread.h
class CTestThread : public CWinThread
{
DECLARE_DYNCREATE(CTestThread)
//protected:
public:
CTestThread();
virtual ~CTestThread();
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
protected:
DECLARE_MESSAGE_MAP()
};
// CTestThread.cpp
IMPLEMENT_DYNCREATE(CTestThread, CWinThread)
CTestThread::CTestThread()
{
}
CTestThread::~CTestThread()
{
}
BOOL CTestThread::InitInstance()
{
CFrameWnd* pWnd = new CFrameWnd;
pWnd->Create(NULL,L"CWinThread Test");
pWnd->ShowWindow(SW_SHOW);
pWnd->UpdateWindow();
m_pMainWnd = pWnd;
return TRUE;
}
int CTestThread::ExitInstance()
{
// TODO: perform any per-thread cleanup here
return CWinThread::ExitInstance();
}
BEGIN_MESSAGE_MAP(CTestThread, CWinThread)
END_MESSAGE_MAP()
2.起动线程。
void Test()
{
CRuntimeClass *pRuntime = RUNTIME_CLASS(CTestThread);
g_pThread = (CTestThread*)pRuntime->CreateObject();
g_pThread->CreateThread(0, 0, NULL);
...
}
3.停止,删除线程。
如果CWinThread的构造函数中的m_bAutoDelete成员被设成TRUE,窗口关闭时,Delete()函数会被自动调用。不然的话,自己进行删除处理。
可以重载SuspendThread(),Run()等函数来实现特有的处
或者:
调用的地方
CWinThread* m_pThrd;
//启动
m_pThrd = AfxBeginThread(RUNTIME_CLASS(CTestThread));
// 需要执行线程中的操作时
m_pThrd->PostThreadMessage(WM_TEST,NULL,NULL);
// 结束线程
HANDLE hp=m_pThrd->m_hThread;
if (hp)
{
if (WaitForSingleObject(hp, 1) != WAIT_OBJECT_0)
{
TerminateThread(hp,0);
}
CloseHandle(hp);
}