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