正文

一个精悍而巧妙的程序2006-08-04 16:29:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/cracker007/17247.html

分享到:

近期用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;}

阅读(4291) | 评论(5)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册