利用事件Event进行线程或进程间的通信

tech2022-10-12  102

1、在服务端exe或dll创建事件Event及独立线程(循环)来监听信号

bool m_bBeginPreview = false; bool m_bEndPreview = false; // 启动监听“开始工作”线程 DWORD WINAPI ThreadBeginPreview(LPVOID pData) { m_bBeginPreview = true; HANDLE hBeginPreview = ::CreateEvent(NULL, FALSE, FALSE, _T("BeginPreview")); while(m_bBeginPreview) { // 执行预览 if (hBeginPreview != INVALID_HANDLE_VALUE) { DWORD dwRet1 = ::WaitForSingleObject(hBeginPreview, WSA_INFINITE); if(dwRet1 == WAIT_OBJECT_0) { // 添加需要代码 } } } CloseHandle(hBeginPreview); return 0; } // 启动监听“结束工作”线程 DWORD WINAPI ThreadEndPreview(LPVOID pData) { m_bEndPreview = true; HANDLE hEndPreview = ::CreateEvent(NULL, FALSE, FALSE, _T("EndPreview")); while(m_bEndPreview) { // 关闭预览 if (hEndPreview) { DWORD dwRet2 = ::WaitForSingleObject(hEndPreview, WSA_INFINITE); if(dwRet2 == WAIT_OBJECT_0) { m_bEndPreview = false; m_bBeginPreview = false;// 结束两个监听线程循环 CHCityModelLocate::GetInstance().ClearDrawingModel(); } } } CloseHandle(hEndPreview); return 0; } void main() { // 创建监控线程 HANDLE hThreadBegin = CreateThread(NULL, 0, ThreadBeginPreview, 0, 0, NULL); CloseHandle(hThreadBegin); HANDLE hThreadEnd = CreateThread(NULL, 0, ThreadEndPreview, 0, 0, NULL); CloseHandle(hThreadEnd); // 启动客户端exe程序 CString sParam = _T("MyClient.exe"); STARTUPINFO startInfo; PROCESS_INFORMATION pinfo = { 0 }; ZeroMemory(&startInfo, sizeof(startInfo)); startInfo.cb = sizeof(startInfo); ZeroMemory(&pinfo, sizeof(pinfo)); startInfo.dwFlags = STARTF_USESHOWWINDOW; startInfo.wShowWindow = SW_SHOW; BOOL bRet = ::CreateProcess(nullptr, sParam.GetBuffer(0), NULL, NULL, FALSE, 0, NULL, NULL, &startInfo, &pinfo); sParam.ReleaseBuffer(); if (!bRet) { CHCString strFailure = _T("启动控制台程序失败:"); strFailure += sParam; AfxMessageBox(strFailure); return; } CloseHandle(pinfo.hProcess); CloseHandle(pinfo.hThread); }

2、在客户端exe或dll来发送Event信号

void CMyClient::OnBnClickedBtnBegin() { // TODO: 在此添加控件通知处理程序代码 HANDLE hBeginPreview = OpenEvent(EVENT_ALL_ACCESS, FALSE, _T("BeginPreview")); if (hBeginPreview == INVALID_HANDLE_VALUE) { AfxMessageBox(_T("开始句柄为空")); return; } SetEvent(hBeginPreview); // 添加处理代码 } void CMyClient::OnBnClickedBtnEnd() { // TODO: 在此添加控件通知处理程序代码 HANDLE hEndPreview = OpenEvent(EVENT_ALL_ACCESS, FALSE, _T("EndPreview")); if (hEndPreview == INVALID_HANDLE_VALUE) { AfxMessageBox(_T("结束句柄为空")); return; } SetEvent(hEndPreview); // 添加处理代码 }
最新回复(0)