Что нового

Как сделать обработку StdoutRead по событию?

vovsla

Осваивающий
Сообщения
607
Репутация
36
Можно ли получать данные из StdoutRead без постоянного его опроса?
Может есть какое-то событие, которое оповещает, что в StdoutRead поступали какие-то данные?
Т.е. вместо нижеуказанного решения
Код:
$PID = Run(@ComSpec&' /c echo test ', '', @SW_SHOW, 3)

While 1
    Sleep(100)
    $STDOut = StdoutRead($PID)
    If $STDOut <> '' Then Exit MsgBox(0,'', $STDOut)
WEnd


Хотелось бы получить что-то вроде этого
Код:
$PID = Run(@ComSpec&' /c echo test ', '', @SW_SHOW, 3)
(здесь регистрация события на поступление данных, к которому привязана функция DateExist)

While 1
    Sleep(100)
WEnd

Func DateExist()
     $STDOut = StdoutRead($PID)
     If $STDOut <> '' Then Exit MsgBox(0,'', $STDOut)
EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
в цикле проверяем существование события и подключаем функцию чтения консоли
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
в цикле проверяем существование события и подключаем функцию чтения консоли
Вопрос как раз в том, как убрать из цикла постоянную проверку наличия данных "StdoutRead".
Т.е. если бы меня устраивало решение указанное ниже, то я бы не задал вопроса
Код:
$PID = Run(@ComSpec&' /c echo test ', '', @SW_SHOW, 3)

While 1
    Sleep(100)
    $STDOut = StdoutRead($PID)
    $STDOut <> '' Then STD($STDOut)
WEnd

Func STD($Data)

EndFunc


Или я чего-то не так понял?
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Код:
$PID = Run(@ComSpec&' /c echo test ', '', @SW_SHOW, 3)
ProcessWaitClose($PID)
MsgBox(0, "", StdoutRead($PID))
Это не подходит, т.к. вышеуказанный код всего лишь пример. Будет запущен процесс, который периодически будет отправлять данные в выходной поток и их необходимо отлавливать. Т.е. нужна регистрация события, которое сработает при поступлении данных в StdoutRead

Кстати, если нужно получить данные однократно и их много, то вышеуказанный пример получит не все данные.
Для получения всех данных требуется другой подход
Код:
Func RunConsole($ConsoleCommand, $Workingdir='')
    Local $PID, $ConsoleInfo, $STDOut

    $PID=Run($ConsoleCommand, $Workingdir, @SW_HIDE, 2)
    If @error Then Return False
    $ConsoleInfo=''
    While 1
        $STDOut = StdoutRead($PID)
        If @error Then ExitLoop
        If $STDOut<>'' Then $ConsoleInfo&=$STDOut
    Wend

    Return $ConsoleInfo
EndFunc
 
Последнее редактирование:
Верх