大家知道一个进程是由至少一个线程组成的,多个线程之间的协同工作是相对较为复杂的,这里主要给大家说一下常用的两种线程之间的通信方式。
线程可以分为工作者线程和窗口线程(即在线程里创建一个附加的隐藏窗口)。
工作者线程是大家最为常用的线程,工作者线程间的同步要用信号量机制操作,举一个例子
//工作者线程1
void CThreadTest::WorkThread1(LPVOID lpParam)
{
while(1)
{
//useful codes
//当有事件通知工作者线程2时
SetEvent(m_hThread2);
}
}
//工作者线程2
void CThreadTest::WorkThread2(LPVOID lpParam)
{
while(1)
{
WaitForSingleObject(m_hThread2,...);//等待m_hThread2事件被激活,等待多个事件用WaitForMultipleObject(...)
//useful codes
}
}
什么?这种方式怎么传参数?有成员变量撒(!·#¥%·fs%—¥%)
窗口线程刚刚说了是线程创建了一个隐藏的窗口,这个窗口具有自己的消息队列和消息处理(通常派生于CWnd类),看一个例子
class CMyWnd : public CWnd
...
void CMyThread::OnInitialize()
{
CMyWnd *m_pMyWnd = new CMyWnd;
m_pMyWnd = CreateEx(....);//创建窗口
m_hMyWnd = m_pMyWnd-GetSafeHwnd();//m_hMyWnd为窗口的句柄
}
显然,线程有了窗口句柄,那么我们要联系它就可以通过向它发送消息:)方便啦
PostMessage(m_hMyWnd,..go to hell..);//:p
两种方式大致的说了一下,前者是信号量机制那么后者就是消息机制,这两种机制在使用时存在一个效率问题,打个比方:削一个苹果,如果前者效率是100%的话,那么后者效率可能是98%或者99%。既然差的不多那么当然用好用的喽,没错,推荐大家用第二种方式,Windows吗,不用Window用什么列?:)除非在特别需要的地方用第一种方式。
Windows的博大精神是需要我们认真去寻味的,毕竟是微软的几千名精英智慧的结晶。
------------------------------------------------------
此篇仅做为编程的心得,若有雷同纯属见鬼,希望高手批评指正