首先要明确VC++中使用消息映射技术处理“消息”和“事件” ,通过DECLARE_MESSAGE_MAP()等宏通杀
事件就是“当....的时候”,事件总是和一个ID有关
消息就是“嗨!你该干....了” ,VS2005以上的“消息”标签中就是VC6 Windows Messages Handler中的内容
我们一般都是在 "当...的时候" 干 XXX0 或者 XXX1 XXX2 .... 也可以 “这件事情我不想理会”(让Windows去干)。 我们也可能在正干XXXn中突然想起: “嗨!我该晚餐了!” 再附上不经典的描述:事件是一个动作——用户触发的动作。 消息是一个信息——传递给系统的信息。 事件与消息的概念在计算机中较易混淆,但本质不同: 事件由用户(操作电脑的人)触发且只能由用户触发,操作系统能够感觉到由用户触发的事件,并将此事件转换为一个(特定的)消息发送到程序的消息队列中。 这里强调的是: 可以说“用户触发了一个事件”,而不能说“用户触发了一个消息”。 用户只能触发事件,而事件只能由用户触发。 一个事件产生后,将被操作系统转换为一个消息,所以一个消息可能是由一个事件转换而来(或者由操作系统产生)。 一个消息可能会产生另一个消息,但一个消息决不能产生一个事件——时间只能由用户触发。
总结(事件,消息的来源):
事件:只能由用户通过外设的输入产生。
消息:(产生消息的来源有三个) (1) 由操作系统产生。 (2) 由用户触发的事件转换而来。 (3) 由另一个消息产生。
(一) 利用用户定义的消息通信
在Windows程序设计中,应用程序的每一个线程都拥有自己的消息队列,甚至工作线程也不例外,这样一来,就使得线程之间利用消息来传递信息就变的非常简单。首先用户要定义一个用户消息,如下所示:
#define WM_USERMSG WMUSER+100;在需要的时候,在一个线程中调用::PostMessage((HWND)param,WM_USERMSG,0,0)或CwinThread::PostThradMessage()来向另外一个线程发送这个消息,上述函数的四个参数分别是消息将要发送到的目的窗口的句柄、要发送的消息标志符、消息的参数WPARAM和LPARAM。
下面的代码的结果是在线程结束时显示一个对话框,提示线程结束:
UINT ThreadFunction(LPVOID pParam)
{
while(!bend)
{
Beep(100,100);
Sleep(1000);
}
::PostMessage(hWnd,WM_USERMSG,0,0);
return 0;
}
////////WM_USERMSG消息的响应函数为OnThreadended(WPARAM wParam,LPARAM lParam)
LONG CTestView::OnThreadended(WPARAM wParam,LPARAM lParam)
{ AfxMessageBox("Thread ended."); Retrun 0;}
上面的例子是工作者线程向用户界面线程发送消息,对于工作者线程,如果它的设计模式也是消息驱动的,那么调用者可以向它发送初始化、退出、执行某种特定的处理等消息,让它在后台完成。在控制函数中可以直接使用::GetMessage()这个SDK函数进行消息分检和处理,自己实现一个消息循环。GetMessage()函数在判断该线程的消息队列为空时,线程将系统分配给它的时间片让给其它线程,不无效的占用CPU的时间,如果消息队列不为空,就获取这个消息,判断这个消息的内容并进行相应的处理。
(二)用事件对象实现通信
在线程之间传递信号进行通信比较复杂的方法是使用事件对象,用MFC的Cevent类的对象来表示。事件对象处于两种状态之一:有信号和无信号,线程可以监视处于有信号状态的事件,以便在适当的时候执行对事件的操作。上述例子代码修改如下: ////////////////////////////////////////////////////////////////////
Cevent threadStart ,threadEnd;
UINT ThreadFunction(LPVOID pParam)
{
::WaitForSingleObject(threadStart.m_hObject,INFINITE);
AfxMessageBox("Thread start.");
while(!bend)
{
Beep(100,100);
Sleep(1000);
Int result=::WaitforSingleObject(threadEnd.m_hObject,0); //等待threadEnd事件有信号,无信号时线程在这里悬停
If(result==Wait_OBJECT_0)
Bend=TRUE;
}
::PostMessage(hWnd,WM_USERMSG,0,0);
return 0;
}
///////////////////////////////////////////////////////////
/Void CtestView::OninitialUpdate()
{ hWnd=GetSafeHwnd();
threadStart.SetEvent();//threadStart事件有信号
pThread=AfxBeginThread(ThreadFunction,hWnd);//启动线程
pThread->m_bAutoDelete=FALSE;
Cview::OnInitialUpdate);
}
////////////////////////////////////////////////////////////////
Void CtestView::OnDestroy()
{ threadEnd.SetEvent();
WaitForSingleObject(pThread->m_hThread,INFINITE);
d elete pThread;
Cview::OnDestroy();
}
请采纳。
温馨提示:内容为网友见解,仅供参考
消息和事件的区别 VC++解惑
VC++中是使用消息映射技术处理“消息”和“事件” 。事件就是“当...的时候”,事件总是和一个ID有关 消息就是“嗨!你该干...了” 。比如鼠标左键点击button的时候,就是wm_lbuttondown这个时候是鼠标点击事件,当系统接受到鼠标点击事件以后,会进行消息处理,比如dc.lineto(x,y)
消息和事件的区别 VC++解惑
一个消息可能会产生另一个消息,但一个消息决不能产生一个事件——时间只能由用户触发。总结(事件,消息的来源):事件:只能由用户通过外设的输入产生。消息:(产生消息的来源有三个) (1) 由操作系统产生。 (2) 由用户触发的事件转换而来。 (3) 由另一个消息产生。(一) 利用用户定义的...
消息和事件的区别 VC++解惑
“事件”发生了以后可能用“消息”来报告事件,也可能直接调用预设的回调方法进行处理。
C语言编写的程序怎么在windows下运行??望各位大哥大姐解惑!!
首先,TC是入门用的,以后的程序设计不会在TC中,练习熟练了,可以选择其他平台,比如你说的VC++。第二,在VC++环境下可以编写控制台程序(就是dos界面程序),你把课本上的代码或TC中的代码敲到VC++中,也只能是在dos界面下运行,因为你的代码没有涉及到Windows编程。第三,VC++中可以用MFC也可以...
请教高手几个VC++的问题,可能是新版与旧版的区别。
1、以前肯定也不能写int a[];至少VC6不能写,除非你int a[] = {1,2,3,4,5};这是可以的。不过这样在2010里应该也是可以的;2、至少VS2008里面char b[] = {"hwo do you do?"};还是可以用的,你说不能用的具体错误是什么?3、其实是可以的,但是你想这样是不行的,不管哪个版本都不...
VC++中无法执行程序是怎么回事?求大神解惑~
需要拍照或截图放上来,以便帮你解决问题。注意:windows7以后的windows操作系统对VC++不支持。我以前常用VC++6.0,现在改用VS2008,测试了以前编写的程序,发现以前VC++6.0的文件可以移植的,一般没问题。
vc++6.0和vs2010的编程代码差别大吗?
一、包含组件不同 1、vc++6.0:集成了MFC 6.0,包含标准版(Standard Edition)、专业版(Professional Edition)与企业版(Enterprise Edition)2、vs2010:带来了 NET Framework 4.0、Microsoft Visual Studio 2010 CTP( Community Technology Preview--CTP),并且支持开发面向Windows 7的应用程序。二、...