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

原创 2013年12月02日 14:36:15

首先在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);
}

深入分析MFC启动流程

精简以上代码,就会发现其实是一样的 1.初始化主框架,保存参数 : if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))...
  • comwise
  • comwise
  • 2013年11月27日 15:59
  • 2321

java是一门注重设计的语言,类和类之间是通过衍生而来的,和世间的起源是如此的相似

java是一门注重设计的语言,每当我们看到现实生活中的所有的事物,都可以将其进行chou xiang...
  • gxiande
  • gxiande
  • 2014年11月23日 23:45
  • 434

如何正确的关闭 MFC 线程

一.关于MFC的线程   1.MFC的线程有两种,一种称为Work线程,一种称为UI线程。一般情况下Work线程与UI线程的区别主要在于UI线程有消息队列(并不是有没有界面,这点要注意,UI线程也是...
  • yangbingzhou
  • yangbingzhou
  • 2014年03月12日 14:30
  • 1999

MFC程序的theApp对象

每次创建一个MFC应用程序,不管是Doc/View类型的,还是对话框类型的,都会发现MFC会自动为我们创建一个CXXXApp的类,其中XXX表示我们的工程名。其实很多时候,我们都不会用到这个类,也不会...
  • jslmes
  • jslmes
  • 2016年07月15日 08:42
  • 831

[MFC]CEdit编辑框类

1. 编辑控件简介:     1) 也是传统控件的一种,用来进行文本的输入和编辑,是用户跟应用程序进行通信最为重要的手段;     2) Windows共有两种类型的编辑控件,一种是单行(比如输入姓名...
  • Lirx_Tech
  • Lirx_Tech
  • 2015年07月25日 13:22
  • 1224

MFC线程(一):简单介绍

线程简介 我们知道一般情况程序中的代码都是按顺序从头开始一行一行的执行以最后.中间不能出现同时执行的情况.比如一段代码调用两个函数 FunOne(); FunTwo(); 只要当函数FunOn...
  • weiwenhp
  • weiwenhp
  • 2013年03月08日 14:13
  • 25728

MFC多线程的创建,包括工作线程和用户界面线程

MFC多线程的创建 1.MFC多线程简介 MFC对多线程进行了一层简单的封装,在Visual C++中每个线程都是从CWinThread类继承而来的。每一个应用程序的执行都有一个主线程,这个主线程...
  • cbNotes
  • cbNotes
  • 2013年01月04日 16:41
  • 68477

MFC多线程各种线程用法 .

一、问题的提出 编写一个耗时的单线程程序:   新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为 IDC_...
  • qq61394323
  • qq61394323
  • 2013年07月15日 09:08
  • 33619

MFC窗口程序启动运行机制剖析

本文的测试环境: IDE:VS2010 + VC助手(GO按钮对后面的跟踪调试很有用) 操作系统:Win8.1...
  • eldn__
  • eldn__
  • 2014年07月18日 21:13
  • 3138

Java中初始化基础类

Java中初始化基础类: (1)类中的构造函数无参; (2)类中的构造函数含有自变量。...
  • xiaoxiaoxiaohaozi
  • xiaoxiaoxiaohaozi
  • 2016年03月21日 09:23
  • 563
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC 线程在WinApp衍生类中启动流程
举报原因:
原因补充:

(最多只允许输入30个字)