消息线程,对MFC消息机制的局部模拟

原创 2006年06月05日 18:30:00

// WorkerThread.h: interface for the CWorkerThread class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_WORKERTHREAD_H__E574C05E_5792_4A49_8021_6BBDD7E0C6DA__INCLUDED_)
#define AFX_WORKERTHREAD_H__E574C05E_5792_4A49_8021_6BBDD7E0C6DA__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <list>

#define TWEN_ERROR_INVALID_MESSAGEID (~0)

#define TWEN_BEGIN_MESSAGE_MAP_LOCAL() LRESULT CWorkerThread::SendMessage(DWORD dwMsgID,WPARAM wParam,LPARAM lParam) /
{ /
 switch(dwMsgID) /
 {
#define TWEN_END_MESSAGE_MAP_LOCAL() default:return TWEN_ERROR_INVALID_MESSAGEID; /
 } /
}
/////////
#define TWEN_DECLARE_MESSAGE_MAP() virtual LRESULT SendMessage(DWORD dwMsgID,WPARAM wParam,LPARAM lParam);
#define TWEN_BEGIN_MESSAGE_MAP(CChild,CParent) LRESULT CChild::SendMessage(DWORD dwMsgID,WPARAM wParam,LPARAM lParam) /
{ /
 LRESULT lRet=CParent::SendMessage(dwMsgID,wParam,lParam); /
 switch(dwMsgID) /
 {
#define TWEN_END_MESSAGE_MAP() } /
 return lRet; /
}
#define TWEN_ON_MESSAGE(ID,OnID) case ID:return OnID(wParam,lParam);
#define TWEN_MSG
/////////
//system message begin
#define TWEN_TM_TEST  0
#define TWEN_TM_USER  1
//system message end

#ifndef _WINDEF_
#ifndef TWEN_WINDEF_
#define TWEN_WINDEF_
typedef unsigned long  DWORD;
typedef unsigned long  WPARAM;
typedef unsigned long  LPARAM;
typedef unsigned long  LRESULT;
typedef unsigned long  BOOL;
typedef unsigned long  UINT;
typedef void*    LPVOID;
#define TRUE    1
#define FALSE    0
#endif
#endif

class CWorkerThread 
{
public://构造和析构
 CWorkerThread();
 virtual ~CWorkerThread();
public://导出函数
 BOOL Start();//开始工作线程
 BOOL Stop();//停止工作线程
 virtual bool OnIdle();//返回false将直接导致线程结束,且不改变线程是否正在运行的状态指示
protected://内部函数
 static UINT ThreadLoop(LPVOID lpv);
 UINT m_MainLoop();
protected://消息响应函数
 //{{TWEN_MSG(CWorkerThread)
 LRESULT TWEN_MSG TWEN_OnTest(WPARAM wParam,LPARAM lParam);
 //}}TWEN_MSG
public://消息机制
 void PostMessage(DWORD dwMsgID,WPARAM wParam,LPARAM lParam);
 TWEN_DECLARE_MESSAGE_MAP()
protected://数据成员
 struct structItem
 {
  DWORD dwMsgID;
  WPARAM wParam;
  LPARAM lParam;
 };
 std::list<structItem> m_Items;
 bool m_bRun;
};

#endif // !defined(AFX_WORKERTHREAD_H__E574C05E_5792_4A49_8021_6BBDD7E0C6DA__INCLUDED_)


// WorkerThread.cpp: implementation of the CWorkerThread class.
//
//////////////////////////////////////////////////////////////////////

#include "WorkerThread.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CWorkerThread::CWorkerThread()
 :m_bRun(false)
{
}

CWorkerThread::~CWorkerThread()
{
}

void CWorkerThread::PostMessage(DWORD dwMsgID,WPARAM wParam,LPARAM lParam)
{
 structItem item;
 item.dwMsgID=dwMsgID;
 item.wParam=wParam;
 item.lParam=lParam;
 m_Items.push_back(item);
}

TWEN_BEGIN_MESSAGE_MAP_LOCAL()
 //{{TWEN_MSG_MAP_LOCAL(CWorkerThread)
 TWEN_ON_MESSAGE(TWEN_TM_TEST,TWEN_OnTest)
 //}}TWEN_MSG_MAP_LOCAL
TWEN_END_MESSAGE_MAP_LOCAL()

BOOL CWorkerThread::Start()
{
 //AfxBeginThread(CWorkerThread::ThreadLoop,this);
 m_bRun=true;
 return TRUE;
}
BOOL CWorkerThread::Stop()
{
 m_bRun=false;
 return TRUE;
}
bool CWorkerThread::OnIdle()
{
 //Sleep(100);
 return true;
}
UINT CWorkerThread::ThreadLoop(LPVOID lpv)
{
 return ((CWorkerThread*)lpv)->m_MainLoop();
}
UINT CWorkerThread::m_MainLoop()
{
 while(m_bRun)
 {
  if(m_Items.size()<1 || m_Items.empty())
  {
   if(OnIdle()) continue;
   else break;
  }
  structItem&item=m_Items.front();
  SendMessage(item.dwMsgID,item.wParam,item.lParam);
  m_Items.pop_front();
 }
 return 0;
}

LRESULT CWorkerThread::TWEN_OnTest(WPARAM wParam,LPARAM lParam)
{
 return 0;
}

 

//test.cpp

#include "WorkerThread.h"
#include "iostream.h"

#define TM_TEST TWEN_TM_USER+1

class CChild:public CWorkerThread
{
public:
 CChild();
 virtual ~CChild();
private:
 //{{TWEN_MSG(CChild)
 LRESULT TWEN_MSG OnTest(WPARAM wParam,LPARAM lParam);
 //}}TWEN_MSG
public:
 TWEN_DECLARE_MESSAGE_MAP()
};
CChild::CChild()
 :CWorkerThread()
{
}
CChild::~CChild()
{
}
TWEN_BEGIN_MESSAGE_MAP(CChild,CWorkerThread)
 //{{TWEN_MSG_MAP(CChild)
 TWEN_ON_MESSAGE(TM_TEST,OnTest)
 //}}TWEN_MSG_MAP
TWEN_END_MESSAGE_MAP()

LRESULT CChild::OnTest(WPARAM wParam,LPARAM lParam)
{
 cout<<"CChild::OnTest/n";
 return 0;
}

int main()
{
 CChild child;
 child.SendMessage(TM_TEST,0,0);
 cin.get();
 return 0;
}

//注意,并未完整测试,只是随便想想

MFC中创建工作线程,进行消息传递

1:在定时器中创建一个线程 case TIMER1: if (m_SpiManage.IsSpiConnect()) {   AfxBeginThread(WORK_ReadSAWtag, N...
  • xinm1001
  • xinm1001
  • 2016-09-09 16:29:55
  • 440

记一次进程线程dll和MFC消息循环的系列问题

主要问题 1、主线程中慎用waitforsingleobject。本次问题出现在当进程B中弹出一个dlg并设置进程A为其父窗口,之前使用setparent失败了,所以直接在构造函数中把A的句柄穿进去...
  • gldcpp
  • gldcpp
  • 2016-07-19 20:19:33
  • 463

MFC消息机制+UI线程和工作线程+模式对话框原理

MFC消息机制,UI线程,工作线程,模式对话框原理,非模式对话框原理
  • Jiangislogining
  • Jiangislogining
  • 2016-10-21 21:23:34
  • 2234

Android 线程消息机制深入分析

1 前言『Android线程消息机制』是本文所要讨论的内容,在此之前我们需要先简单介绍下(之后会详细说明)线程消息机制中的四个主要成员,它们分别是Looper、Handler、Message和Mess...
  • hjpdyxhjd
  • hjpdyxhjd
  • 2015-12-20 23:34:44
  • 1843

MFC六大机制之三:消息映射机制

上篇我们通过重写WindowProc函数来处理消息,今天我们采用下面的方法实现同样的功能  1.建一个win32简单应用程序,不要认为这样就不能写出MFC程序,因为是不是MFC程序取决于调没调MFC...
  • meetings
  • meetings
  • 2015-06-28 23:12:46
  • 3250

MFC的消息机制的实现原理和消息处理的过程

下面几节将分析MFC的消息机制的实现原理和消息处理的过程。为此,首先要分析ClassWizard实现消息映射的内幕,然后讨论MFC的窗口过程,分析MFC窗口过程是如何实现消息处理的。 消息映射的...
  • cherish_2012
  • cherish_2012
  • 2014-03-13 18:12:17
  • 14764

wxwidgets的自定义消息与处理

wxwidgets的消息处理机制比较灵活,效率也比较高,这里只研究一下最基本的东西。自定义一个消息以前的用法是BEGIN_DECLARE_EVENT_TYPES()    DECLARE_EVENT_...
  • kese
  • kese
  • 2007-09-08 16:22:00
  • 3109

消息机制,异步和多线程

有了framework后,我们不用面对赤裸裸的OS API,做一些重复而繁杂的事情。但天下没有免费的午餐,我们还是需要学会高效正确的使用不同的framework,很多处理某一特定问题的手法在不同的fr...
  • Smart_yujin
  • Smart_yujin
  • 2013-08-29 14:31:06
  • 874

异步消息处理机制--线程

多线程编程 执行一条耗时操作,需放在子线程里运行 1、线程的基本用法 新建类继承 或实现接口  ,重写方法--(可直接内部类) ● class MyThread extends Thread ...
  • qq_35893033
  • qq_35893033
  • 2017-02-11 14:06:23
  • 572

C++消息映射原理机制源代码[完全不是MFC中的消息映射机制]

简介:完全不是MFC中的消息映射机制,即没有用到MFC中的一点消息机制。 但原理却是一样的,是个麻雀虽小五脏俱全的消息映射原理,简单实现了 SendMail(APPMSG_START, NULL, A...
  • hixi2007
  • hixi2007
  • 2016-08-04 09:44:31
  • 708
收藏助手
不良信息举报
您举报文章:消息线程,对MFC消息机制的局部模拟
举报原因:
原因补充:

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