@lixaka

Как создать два процесса,в котором один отсылает события, а другой распознает их и обрабатывает?

Создаются два процесса. Процесс A в случайном порядке, с интервалом 1 с активизирует одно из двух событий. Процесс B распознает эти события и отображает их на экране как буквы X или Y. Когда количество выданных букв достигает 100, процесс B сообщает A, что пора завершать работу.

Процесс А

#include "stdafx.h"
#include "process.h"
#include
int main(void)
{
DWORD dwWaitResult;
STARTUPINFO si;
PROCESS_INFORMATION pi;
HANDLE hEvent1=CreateEvent (NULL, FALSE, FALSE,L"hEvent1");
HANDLE hEvent2=CreateEvent(NULL,FALSE,FALSE,L"hEvent2");
HANDLE hEvent3=CreateEvent(NULL,FALSE,FALSE,L"hEvent3");

ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
if (!CreateProcess(L"C:\\B\\Debug\\B.exe", NULL, NULL, NULL, FALSE,CREATE_NEW_CONSOLE, NULL, NULL, &si, π))

CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);

do
{
HANDLE events[]={hEvent1, hEvent2,hEvent3};
SetEvent(events[rand()&1]);
DWORD dwWaitResult = WaitForSingleObject(hEvent3, INFINITE);
}
while (dwWaitResult!=WAIT_OBJECT_0);
return 0;
}
Процесс B
#include "stdafx.h"
#include
#include
int main(int argc, char* argv[])
{
HANDLE hEvent1 = OpenEvent(NULL,FALSE,L"hEvent1");
HANDLE hEvent2 = OpenEvent(NULL,FALSE,L"hEvent2");
HANDLE hEvent3 = OpenEvent(NULL,FALSE,L"hEvent3");
int k=0;
while (k<100)
{
HANDLE events[]={hEvent1, hEvent2};
DWORD dwWaitResult = WaitForMultipleObjects(2, events, FALSE, 0);
if (dwWaitResult==WAIT_OBJECT_0)
{
std::cout<<"X";
}

if (dwWaitResult==WAIT_OBJECT_0+1)
{
std::cout<<"Y";
}
k++;
}
if (k==100)
{
SetEvent(hEvent3);
return 0;
}
}

Последний параметр в CreatEvent компилятор пропускает только так,перебор разных вариантов результата не дал(может как раз в этом ошибка?
  • Вопрос задан
  • 3076 просмотров
Пригласить эксперта
Ответы на вопрос 2
@lixaka Автор вопроса
спасибо!
процесс А
#include "stdafx.h"
#include "process.h"
#include <windows.h>
int main(void)
{
	DWORD dwWaitResult;
	STARTUPINFO si;
	PROCESS_INFORMATION pi;
		HANDLE hEvent1=CreateEvent (NULL, FALSE, FALSE,L"hEvent1");
		HANDLE hEvent2=CreateEvent(NULL,FALSE,FALSE,L"hEvent2");
		HANDLE hEvent3=CreateEvent(NULL,FALSE,FALSE,L"hEvent3");

 ZeroMemory(&si, sizeof(STARTUPINFO));
 si.cb = sizeof(STARTUPINFO);
 if (!CreateProcess
	 (L"C:\\B\\Debug\\B.exe", NULL, NULL, NULL, FALSE,CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
 
  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread);
		
	do
	{
		HANDLE events[]={hEvent1, hEvent2,hEvent3};
		SetEvent(events[rand()&1]);
		DWORD dwWaitResult = WaitForSingleObject(hEvent3, INFINITE);
	}
	while (dwWaitResult!=WAIT_OBJECT_0);

return 0;
}

процесс B
#include "stdafx.h"
#include <windows.h>
#include <iostream>
int main(int argc, char* argv[])
{
	HANDLE hEvent1 = OpenEvent(NULL,FALSE,L"hEvent1");
	HANDLE hEvent2 = OpenEvent(NULL,FALSE,L"hEvent2");
	HANDLE hEvent3 = OpenEvent(NULL,FALSE,L"hEvent3");
	int k=0;
	while (k<100)
	{

		HANDLE events[]={hEvent1, hEvent2};
		 DWORD dwWaitResult = WaitForMultipleObjects(2, events, FALSE, 0);
        if (dwWaitResult==WAIT_OBJECT_0) 
				{
					std::cout<<"X";
					
				}
		
		 if (dwWaitResult==WAIT_OBJECT_0+1) 
				{
					std::cout<<"Y";
					
				}
			
		k++;

	}
	if (k==100)
		{
			SetEvent(hEvent3);
			return  0;
		}
}
Ответ написан
Комментировать
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
Возможно проблема в этом: If lpEventAttributes is NULL, the event handle cannot be inherited by child processes.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы