Windiws -Как создать 2 процесса, в которых один активизирует события, а другой распознает их?
Создаются два процесса. Процесс A в случайном порядке, с интервалом 1 с активизирует одно из двух событий. Процесс B распознает эти события и отображает их на экране как буквы X или Y. Когда количество выданных букв достигает 100, процесс B сообщает A, что пора завершать работу.
Код, который по моей логики:
Процесс А
#include "stdafx.h"
#include
int main(int argc, char* argv[])
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
HANDLE hEvent1 = CreateEvent(NULL,FALSE,FALSE,NULL);
HANDLE hEvent2 = CreateEvent(NULL,FALSE,FALSE,NULL);
HANDLE hEvent3 = CreateEvent(NULL,FALSE,FALSE,NULL);
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
if (!CreateProcess(L"C:\\Users\Documents\Visual Studio 2010\Projects\B\Debug\B.exe", NULL, NULL, NULL, FALSE,
CREATE_NEW_CONSOLE, NULL, NULL, &si, π))
// закрываем дескрипторы этого процесса
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
int n=0;
while (n<=100)
{
DWORD WaitForSingleEvent (HANDLE, DWORD dwMilliseconds);
BOOL SetEvent((hEvent1)||(hEvent2));
WaitForSingleObject(hEvent3, 0);
DWORD dwWaitResult = WaitForSingleObject(hEvent3, INFINITE);
if (dwWaitResult != WAIT_OBJECT_0)
{
return 0;
}
n++;
}
}
Процесс B
#include "stdafx.h"
#include
#include
int main(int argc, char* argv[])
{
HANDLE hEvent1 = OpenEvent(NULL,FALSE,NULL);
HANDLE hEvent2 = OpenEvent(NULL,FALSE,NULL);
HANDLE hEvent3 = OpenEvent(NULL,FALSE,NULL);
int k=0;
while (k<100)
{
Только начинаю разбирать эту тему,но не могу даже проверить правильно ли это работает. Вроде по логике запускаю сигнал - жду - распознаю-подаю другому процессу, может кто может помочь с этим вопросом?Как правильно и граммотно это написать и в правильном ли направлении иду,может что-то исправить необходимо
Направление правильное, но реализация хромает.
Нужно создавать именованные события (последний параметр у CreateEvent).
Ждать одно из многих событий можно при помощи WaitForMultipleObjects - она возвращает WAIT_OBJECT_0+номер первого выставленного события.
Дерзайте.
Спасибо большое!Можно еще задать такой вопрос,вот "Процесс A в случайном порядке, с интервалом 1 с активизирует одно из двух событий. " можно ли это реализовать строчкой
BOOL SetEvent((hEvent1)||(hEvent2));
?
Армянское Радио:
А как можно обозначить условие в процессе B распознавание события, находящемся в сигнальном состоянии?Например, здесь мы ждем события
HANDLE events[]={hEvent1, hEvent2};
DWORD dwWaitResult = WaitForMultipleObjects(2, events, FALSE, 0);
if (dwWaitResult != WAIT_OBJECT_0)
{
if (hEvent1!=NULL) //А здесь по идее нужно обозначить какое именно пришло событие,чтобы вывести на экр ан либо Х либо Y,но таким образом программа не заходит внутрь if
{
std::cout<<"X";
}
lixaka: dwWaitResult равна WAIT_OBJECT_0 плюс индекс события в массиве events.
Если вернулось WAIT_OBJECT_0 - в сигнальном состоянии hEvent1, если WAIT_OBJECT_0+1 - событие hEvent2
Армянское Радио: спасибо!но вот вроде замечания были учтены,однако все равно не работает не пойму почему,может чтото очевидное упускаю?
#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");