Вопрос по анонимным пайпам
Участников: 2
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Вопрос по анонимным пайпам
Читал тут туториал исзелиона по пайпам, но там все красиво будет работать если вызываемый процесс выполнил задачу и завершился. Там принцип построен именно на этом. Для этого в принципе не надо использовать кучу винапишного кода. В freebasic есть простое решение для этой задачи Open pipe.
У меня вопрос в другом. К примеру у меня запущена консольная программа. Чтобы не нагружать сильно, допустим обычное возведение в степень:
А теперь сам вопрос, как оперировать этой программой из другой консольной программы?
Ведь по туториалам получается, что каждый раз создается новый процесс, но это неприемлемо. Ведь в программе может что-то сохраняться для следующего вызова.
В интернете везде написано, что дескриптор для записи после создания процесса надо закрывать. Но как тогда после этого передавать по каналу данные в программу?
Кто хорошо понимает, разъясните пожалуйста на пальцах.
У меня вопрос в другом. К примеру у меня запущена консольная программа. Чтобы не нагружать сильно, допустим обычное возведение в степень:
- Код:
Dim As Integer iValue
Do
Input "Input value:", iValue
iValue ^=2
Print iValue
Sleep(1)
Loop Until iValue = 100
А теперь сам вопрос, как оперировать этой программой из другой консольной программы?
Ведь по туториалам получается, что каждый раз создается новый процесс, но это неприемлемо. Ведь в программе может что-то сохраняться для следующего вызова.
В интернете везде написано, что дескриптор для записи после создания процесса надо закрывать. Но как тогда после этого передавать по каналу данные в программу?
Кто хорошо понимает, разъясните пожалуйста на пальцах.
trew- Сообщения : 331
Дата регистрации : 2010-10-14
Re: Вопрос по анонимным пайпам
Все я уже разобрался.
1) Нужно создать две трубы
2) Одни концы(дескрипторы) для чтения и записи присвоить при старте дочернему процессу, а после запуска их освободить, как и писал исзелион. Хотя я пробовал не освобождать, все равно работает...
3) Вторыми пользоваться в родительском процессе
С панталыку сбивают разные исходники малопонимающих людей и еще более коварно то, что эти исходники не работают или работают не так как нужно. Находил исходники и на freebasic с созданием двух труб, но там похоже тоже писал не разобравшийся человек (похоже скопировал откуда-то, а в итоге куча ненужных вызываемых функций и работал он подобно исходнику исзелиона). Заглядывал и в MSDN , но там так замудрено блин... И все таки я нашел реально работающий исходник на Си от создателя WinBoard, посмотрев который, стало все предельно ясно.
Как только подкручу работу пайпов к шахматному движку, выложу на своем сайте пример.
1) Нужно создать две трубы
2) Одни концы(дескрипторы) для чтения и записи присвоить при старте дочернему процессу, а после запуска их освободить, как и писал исзелион. Хотя я пробовал не освобождать, все равно работает...
3) Вторыми пользоваться в родительском процессе
С панталыку сбивают разные исходники малопонимающих людей и еще более коварно то, что эти исходники не работают или работают не так как нужно. Находил исходники и на freebasic с созданием двух труб, но там похоже тоже писал не разобравшийся человек (похоже скопировал откуда-то, а в итоге куча ненужных вызываемых функций и работал он подобно исходнику исзелиона). Заглядывал и в MSDN , но там так замудрено блин... И все таки я нашел реально работающий исходник на Си от создателя WinBoard, посмотрев который, стало все предельно ясно.
Как только подкручу работу пайпов к шахматному движку, выложу на своем сайте пример.
trew- Сообщения : 331
Дата регистрации : 2010-10-14
Re: Вопрос по анонимным пайпам
Вот синтаксис команды, создающей анонимный пайп:
BOOL WINAPI CreatePipe(
_Out_ PHANDLE hReadPipe,
_Out_ PHANDLE hWritePipe,
_In_opt_ LPSECURITY_ATTRIBUTES lpPipeAttributes,
_In_ DWORD nSize
);
Т. е. тут явно надо дать адрес на переменные для каналов чтения и записи. Потом при создании процесса их надо будет указать :
typedef struct _STARTUPINFO {
...
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;
Мне видится один выход - сделать свой класс, перегрузив в него операторы записи и чтения (Let/Cast)
BOOL WINAPI CreatePipe(
_Out_ PHANDLE hReadPipe,
_Out_ PHANDLE hWritePipe,
_In_opt_ LPSECURITY_ATTRIBUTES lpPipeAttributes,
_In_ DWORD nSize
);
Т. е. тут явно надо дать адрес на переменные для каналов чтения и записи. Потом при создании процесса их надо будет указать :
typedef struct _STARTUPINFO {
...
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;
Мне видится один выход - сделать свой класс, перегрузив в него операторы записи и чтения (Let/Cast)
assembler_c- Сообщения : 12
Дата регистрации : 2013-07-02
Откуда : Кировоград, Украина
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|