您的位置:首页 > 其它

进程间的多线程同步事件控制方法

2010-07-22 07:30 169 查看
有很多,下面是一种发送方发送通讯的消息以通知接收方,接收方在收到发送方的消息后就可以对内存进行读写操作。在程序设计中采用Windows注册消息进行消息传递,首先在发送进程初始化过程中进行消息注册:m_nMsgMapped=::RegisterWindowsMessage("Mapped");m_nMsgHandle=::RegisterWindowsMessage("Handle");m_nMsgShared=::RegisterWindowsMessage("Shared");在程序运行中向接收进程发送消息:CWnd*pWndRecv=FindWindow(lpClassName,"Receive");pWndRecv->SendMessage(m_MsgMapped,0,0);pWndRecv->SendMessage(m_nMsgHandle,(UINT)GetCurrentProcessID(),(LONG)pApp->m_hGlobalHandle);pWndRecv->SendMessage(m_nMsgShared,0,0);可以按如下方式发送WM_COPYDATA消息:staticCOPYDATASTRUCTcds;//用户存放数据pWnd->SendMessage(WM_COPYDATA,NULL,(LONG)&cds);接收方进程初始化也必须进行消息注册:UNITCRecvApp::m_nMsgMapped=::RegisterWindowsMessage("Mapped");UNITCRecvApp::m_nMsgHandle=::RegisterWindowsMessage("Handle");UNITCRecvApp::m_nMsgShared=::RegisterWindowsMessage("Shared");同时映射消息函数如下:ON_REGISTERED_MASSAGE(CRecvApp::m_nMsgMapped,OnRegMsgMapped)ON_REGISTERED_MASSAGE(CRecvApp::m_nMsgHandle,OnRegMsgHandle)ON_REGISTERED_MASSAGE(CRecvApp::m_nMsgShared,OnRegMsgShared)在这些消息函数就可以采用上述技术实现接收进程中数据的读写操作了。

------------------------------------------------------

进程间的多线程同步事件控制方法

由于event对象是系统范围内有效的,所以另一个进程(即一个应用程序,本身也
是一个线程)可调用OpenEvent函数,通过对象的名字获得对象的句柄, 但对象
必须是已经创建的,然后可将这个句柄用于ResetEvent、SetEvent和
WaitForMultipleObjects等函数中。这样可以实现一个进程的线程控制另一进程
生成的线程的运行。如下面的语句就是通过对象名字“MyEvent”获得了上面进程
生成的hNoBlockEvent对象的句柄,再使用这个句柄将对象状态设为nonSignaled。
在上述的 LoopFunc函数中由于该对象的状态已经改变,使得上面的线程暂停运行。

HANDLE hEvent=OpenEvent(EVENT_ALL_ACCESS,true, "MyEvent ");

ResetEvent(hEvent);

OpenEvent函数的第一个参数表示函数的调用线程对event对象的访问权限,比如
让线程拥有对象所有的访问权限,就选参数EVENT_ALL_ACCESS,这样线程就能用
ResetEvent函数改变对象的状态;参数true表示由这个进程派生的子进程可以继
承该句柄;最后一个参数指出了event对象的名字。用下面的语句设置对象
hNoBlockEvent的状态为Signaled,就可以使线程继续运行,如SetEvent(hEvent)。

进程不再使用该句柄时尽可以用CloseHandle函数关闭对象句柄,但对于同一个event
对象而言,因为它可能还在别的线程中被使用,所以只有在它的所有被引用的句
柄都关闭后对象才会被系统释放,文中提到的所有 event对象在主线程和线程之间
以及在不同的进程之间所起的控制作用如图1所示:
① ┌───────┐ ①:关闭窗口
┌──→─┤ hCloseEvent ├───┐ ②:对上面事件的反应
│ └───────┘ │ |
│ ┌───────┐ ↓ | 暂停/恢复线程的运行
│ │ hThread 或 │②┌─┴─┐ ┌───────┐ ┌───┐
┌─┴─┐ ┌┤hNoCloseEvent ├←┤ 线程 ├←┤hNoBlockEvent ├←┤进程 2│
│主线程├←┘└───────┘ └┬─┬┘ └───────┘ └───┘
│/进程1├→┐┌───────┐ ↑ │ |不同进程之间
└─┬─┘⑴└┤ hWatchEvent ├──┘ │ |的地址界限
↑ └───────┘ │
│ ┌───────┐ │ ⑴:监测数据
└────┤ hNtyEvent ├←───┘ ⑵:线程满足监测条件
└───────┘⑵

-----------------------------------------------------------------

4、进程之间的消息发送与接收

在实际应用中进程之间需要发送和接收Windows消息来通知进程间相互通讯,发送方发送通讯的消息以通知接收方,接收方在收到发送方的消息后就可以对内存进行读写操作。

我们在程序设计中采用Windows注册消息进行消息传递,首先在发送进程初始化过程中进行消息注册:
m_nMsgMapped=::RegisterWindowsMessage("Mapped");
m_nMsgHandle=::RegisterWindowsMessage("Handle");
m_nMsgShared=::RegisterWindowsMessage("Shared");
在程序运行中向接收进程发送消息:
CWnd* pWndRecv=FindWindow(lpClassName,"Receive");
pWndRecv->SendMessage(m_MsgMapped,0,0);
pWndRecv->SendMessage(m_nMsgHandle,
(UINT)GetCurrentProcessID(),(LONG)pApp->m_hGlobalHandle);
pWndRecv->SendMessage(m_nMsgShared,0,0);
可以按如下方式发送WM_COPYDATA消息:
static COPYDATASTRUCT cds;//用户存放数据
pWnd->SendMessage(WM_COPYDATA,NULL,(LONG)&cds);

接收方进程初始化也必须进行消息注册:

UNIT CRecvApp:: m_nMsgMapped=::RegisterWindowsMessage("Mapped");
UNIT CRecvApp::m_nMsgHandle=::RegisterWindowsMessage("Handle");
UNIT CRecvApp::m_nMsgShared=::RegisterWindowsMessage("Shared");
同时映射消息函数如下:
ON_REGISTERED_MASSAGE(CRecvApp::m_nMsgMapped,OnRegMsgMapped)
ON_REGISTERED_MASSAGE(CRecvApp::m_nMsgHandle,OnRegMsgHandle)
ON_REGISTERED_MASSAGE(CRecvApp::m_nMsgShared,OnRegMsgShared)
在这些消息函数我们就可以采用上述技术实现接收进程中数据的读写操作了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: