MFC 线程在WinApp衍生类中启动流程

本文介绍如何在MFC的WinApp派生类中启动线程,并解决线程循环发送消息的问题。通过使用全局SetTimer设置定时器,配合静态回调函数,实现在非CWnd类中定时发送消息。同时,保存线程ID以便于线程间通信。
摘要由CSDN通过智能技术生成

首先在WinApp中进行创建线程实例,然后进行线程的CreateThread()---这样就实现了线程的启动。

那么如果我想用对线程实现循环发送消息怎么办呢:

1、首先是在WinApp中无法拦截WM_TIMER消息进行定时触发器的实现循环

2、在WinApp中进行无限循环的时候就是出现无法退出的情况这样窗口的创建就会失败

那么解决方案是:

使用全局的SetTimer进行设置,但是需要hWnd,又是一个问题hWnd是NULL,那么全局SetTimer函数就会返回一个新的计时器,然后执行SetTimer指定的回调函数(值得注意的是回调函数必须是静态的,而且声明为CallBack类型)。

BOOL CTWinApp::InitInstance()
{
 //需要考虑到指针的生命周期
 m_pMainWnd = new CMainWindow();
 dynamic_cast(m_pMainWnd)->MainWindowInit();//检查指针的类型

 if( !m_pMainWnd )
 {
  _tprintf(_T("new CFrameWndfalse\r\n"));

  return FALSE;
 }
 
 m_pMainWnd->ShowWindow(m_nCmdShow);
 m_pMainWnd->UpdateWindow();

 //线程创建
 m_pThread.CreateThread();//主线程
 TIMERPROC lpTimerFunc =CWndProbeThread::TimerCallback;
 DWORD nID = ::SetTimer(NULL, 0, 3000,lpTimerFunc);

 return TRUE;
}

还要注意的是我们给什么线程发送消息就在什么线程里面进行SetTimer指定的回调函数的声明和定义

还要注意的是在发送消息的时候需要指定线程ID,所以要设置函数进行线程ID的保存进行静态的存放

class CWndProbeThread: public CWinThread
{
 public:
  CWndProbeThread(void);
  ~CWndProbeThread(void);
  static UINT threadProc(LPVOIDpParam);//线程触发函数执行体
  static void CALLBACKTimerCallback( HWND, UINT, UINT_PTR, DWORD);//在非CWnd类中进行设置定时器的时候,不能拦截系统的WM_TIMER消息了,但是可以自己设置全局的定时器的回调函数进行相关处理
  static DWORDGetCurrentThreadId();//关键的问题就是在定时器的回调函数中无法获取当前线程的ID,那么我可以在线程的类中,设置静态的线程ID变量来存放当前线程的ID
  BOOLCreateThread();//在CreateThread中重新进行判断线程的创建的开始

 private:
  void workProc();
  static DWORDm_CurrentThreadId;//静态的存放当前线程的ID

};
VOID CWndProbeThread::TimerCallback( HWND hwnd, UINT uMsg, UINT_PTRidEvent, DWORD dwTime )
{
 ::KillTimer( hwnd, idEvent );
 
 static UINT_PTR evtThread = WM_USER + 100;
 ::PostThreadMessage(CWndProbeThread::GetCurrentThreadId(), evtThread++, 0, 0);

 TIMERPROC lpTimerFunc = TimerCallback;
 DWORD nID = ::SetTimer(NULL, 0, 3000,lpTimerFunc);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值