近期用CreateProcess的时候出了些问题,发现第一个时间片的末尾总会有重复的指令在执行,于是想看看_beginthreadex能不能解决这个问题,无奈_beginthreadex却不接受我的线程函数,问了问v兄,v兄也说不清楚原因,给出了互斥体的方法来解决。问题虽然解决了,但是无法用_beginthreadex总让我觉得很不爽,毕竟谁知道CreateProcess什么时候会出点问题呢。于是到处搜索资料,却意外的发现了一个叹为观止的进程间的自我通信,虽然与我本来的目的相差了很多,但是这个程序巧妙的构思让我兴奋不已,不敢独享,拿出来让大家也欣赏一下: #include"iostream.h"#include"windows.h" static LPCTSTR g_szContinueEvent="w2kdg.EventDemo.event.Continue"; BOOL CreateChild(LPCTSTR szAppName){ STARTUPINFO si; ::ZeroMemory(reinterpret_cast<void*>(&si),sizeof(si)); si.cb=sizeof(si); PROCESS_INFORMATION pi; BOOL bCreateOK=::CreateProcess(szAppName, "child", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); if(bCreateOK) { ::CloseHandle(pi.hProcess); ::CloseHandle(pi.hThread); } return bCreateOK;} void WaitForChild(LPCTSTR szAppName){ HANDLE hEventContinue=::CreateEvent(NULL, TRUE, FALSE, g_szContinueEvent); if(hEventContinue!=NULL) { if(::CreateChild(szAppName)) { ::WaitForSingleObject(hEventContinue,INFINITE); } ::CloseHandle(hEventContinue); hEventContinue=INVALID_HANDLE_VALUE; }} void SignalParent(){ HANDLE hEventContinue=::OpenEvent(EVENT_MODIFY_STATE, FALSE, g_szContinueEvent); if(hEventContinue!=NULL) { ::SetEvent(hEventContinue); } ::CloseHandle(hEventContinue); hEventContinue=INVALID_HANDLE_VALUE;} int main(int argc,char *argv[]){ cout<<"\n"<<argv[0]<<endl; if(::strcmp(argv[0],"child")!=0) { cout<<"Parent waiting on child"<<endl; ::WaitForChild(argv[0]); cout<<"Parent released"<<endl; } else { ::SignalParent(); } return 0;}

评论