К примеру, есть у меня два пайпа и два процесса. Дочерний процесс может записать данные только в один из двух пайпов. В родительском процессе, мне нужно каким-то образом определить, из какого из двух пайпов мне нужно вычитать данные. Каким образом это можно сделать?
Re: Одновременное блокирующее чтение из двух пайпов
Здравствуйте, Kubun, Вы писали:
K>Приветствую.
K>К примеру, есть у меня два пайпа и два процесса. Дочерний процесс может записать данные только в один из двух пайпов. В родительском процессе, мне нужно каким-то образом определить, из какого из двух пайпов мне нужно вычитать данные. Каким образом это можно сделать?
асинхронное чтение, например.
можно сделать 2 manual-reset event, задать их при начале асинхронного чтения из обеих пайпов, и просто ждать на WaitForMultipleObjectsEx.
наверное, можно сделать и один евент, отдавать его при так же при чтении обеим ReadFileEx, и определять, из какого пайпа пришли данные, а ждать уже на WaitForSingleObjectEx.
Re: Одновременное блокирующее чтение из двух пайпов
Здравствуйте, Kubun, Вы писали:
K>Приветствую.
K>К примеру, есть у меня два пайпа и два процесса. Дочерний процесс может записать данные только в один из двух пайпов. В родительском процессе, мне нужно каким-то образом определить, из какого из двух пайпов мне нужно вычитать данные. Каким образом это можно сделать?
WaitForMultipleObject()
который вернет OBJECT_0 + i где i это номер пайпа в масиве ему переданных хендлов в качестве параметра.
Re[2]: Одновременное блокирующее чтение из двух пайпов
Здравствуйте, _Dreamer, Вы писали:
_D>асинхронное чтение, например. _D>можно сделать 2 manual-reset event, задать их при начале асинхронного чтения из обеих пайпов, и просто ждать на WaitForMultipleObjectsEx.
_D>наверное, можно сделать и один евент, отдавать его при так же при чтении обеим ReadFileEx, и определять, из какого пайпа пришли данные, а ждать уже на WaitForSingleObjectEx.
К сожалению, дочерний процесс — это выполнение сторонней программы и не поддается изменению. Есть лишь возможность узнать результат выполнения, но я не могу ведь дожидаться полностью завершения программы, может забиться буфер пайпа и он заблокируется на записи.
Re[2]: Одновременное блокирующее чтение из двух пайпов
Здравствуйте, _Dreamer, Вы писали:
_D>асинхронное чтение, например. _D>можно сделать 2 manual-reset event, задать их при начале асинхронного чтения из обеих пайпов, и просто ждать на WaitForMultipleObjectsEx.
_D>наверное, можно сделать и один евент, отдавать его при так же при чтении обеим ReadFileEx, и определять, из какого пайпа пришли данные, а ждать уже на WaitForSingleObjectEx.
Overlapped read сбрасывает event в начале работы. Поэтому у вас может получиться race condition:
1) Вы отдаете event первому read'у
2) Он успевает просигналить
3) Вы отдаете event второму read'у. Он его сбрасывает
4) Вы ждете завершения read'а до морковкина заговения, хотя данные от первого read'а уже готовы
Это, конечно, можно поднапрягшись обойти, но зачем усложнать себе жизнь на ровном месте?
Re: Одновременное блокирующее чтение из двух пайпов
Здравствуйте, Kubun, Вы писали:
K>К примеру, есть у меня два пайпа и два процесса. Дочерний процесс может записать данные только в один из двух пайпов. В родительском процессе, мне нужно каким-то образом определить, из какого из двух пайпов мне нужно вычитать данные. Каким образом это можно сделать?
Два overlapped ReadFile(), WaitForMultipleEvents() (или completion port, для храбрых духом), чтобы ожидать завершения операции чтения.