CWinThread的Run()成员函数是一个虚函数,这就意味着你可以重载它,进行自己的处理。你可以从CWinThread派生一个新类,在新类中重载Run()。
解决方案 »
- VS2005 DLL调试断点失效问题
- 为什么cvCvtColor转换后的灰度图还是24位?
- error RC2175 : resource file res\LEDPlayer.ico is not in 3.00 format?
- 散分
- 急!!MFC ODBC编程操作ORACLE数据库,要操作的表的列是可变的,无法用classwizard来创建绑定列的CRecordSet来编程,怎么办?
- AfxMessageBox()系统提示界面太土,能花最小代价美化吗?
- 请问:关于网络的问题,参与者有分!
- 请教函数FlushFileBuffers和PurgeComm的用法?(答者有分)
- 200 分相送,关于MFC的导出函数的问题求救
- 请问char,CString,lpstr,lpctstr等的区别?
- 怎样用MFC的类CAsyncSocket作服务器程序同时对多个客户端程序发信息
- 用数字来实现汉字编码,又不准直接用区位码……
还有我怎样保证线程的生命周期与主线程的一致呢?
ExitInstance,InitInstance,OnIdle,PreTranslateMessage,ProcessWndProcException和Run,其中Run是最重要的啦..,其它再重载ExitInstance和InitInstance就可以了.
另外还要注意:DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE该类.
启动线程用AfxBeginThread,
AfxBeginThread有两个重载的版本,一个用于工作者线程,一个用于界面线程,
CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );
这个要提供RuntimeClass的是用于界面线程的.RUN方法是系统调用InitInstance后,自动调用的,通常在其中添加消息循环.
如下:这是MFC CWinThread 的源代码,就是一个无限的消息泵循环,和SDK程序中的
WinMain的消息循环相同.
// for tracking the idle time state
BOOL bIdle = TRUE;
LONG lIdleCount = 0; // acquire and dispatch messages until a WM_QUIT message is received.
for (;;)
{
// phase1: check to see if we can do idle work
while (bIdle &&
!::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE))
{
// call OnIdle while in bIdle state
if (!OnIdle(lIdleCount++))
bIdle = FALSE; // assume "no idle" state
} // phase2: pump messages while available
do
{
// pump message, but quit on WM_QUIT
if (!PumpMessage())
return ExitInstance(); // reset "no idle" state after pumping "normal" message
if (IsIdleMessage(&m_msgCur))
{
bIdle = TRUE;
lIdleCount = 0;
} } while (::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE));
}如果你仅仅是想在线程中另起一个窗口而已,很幸运,你只需要重载InitInstance即可.
在该方法中创建你要的窗口,将其赋值给CWinThread的m_pMainWnd就可以了.这个线程
将运行该窗口的消息循环,窗口就归这个线程了.