Автор Тема: Вывод консольного приложения в окно с авто обновлением  (Прочитано 1298 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Эта тема содержит сообщение, помеченное как лучший ответ. Кликните здесь для перехода к этому сообщению.

Оффлайн winix [?]

  • Сообщений: 79
  • Репутация: -1
    • блог
    • Награды
  • Версия AutoIt: 3.3.12.0
Делаю обёртку для нескольких одновременно работающих консольных приложений.
Пока единственное рабочее решение попалось тут , но информация обновляется только при нажатии кнопки, а надо чтоб обновлялась постоянно пока развёрнуто окно.

Попробовал убрать вывод из обработки кнопки в общий цикл, вроде бы работает, но при попытке выделить текст, всё что сначало выделения и до конца исчезает.
Код: AutoIt [Выделить]
$GUI = GUICreate("Console")
$Btn = GUICtrlCreateButton("Enter", 350, 5, 45, 20, 0x01) ; $BS_DEFPUSHBUTTON
$Edt = GUICtrlCreateEdit("", 5, 30, 390, 365, 0x200840) ; $ES_READONLY + $ES_AUTOVSCROLL + $WS_VSCROLL
GUICtrlSendMsg(-1, 0xC5, -1, 0) ; $EM_LIMITTEXT
GUISetState(@SW_SHOW)

$PID = Run(@ComSpec, "", @SW_HIDE, 9)
Sleep(100)
$Out = StdoutRead($PID)
GUICtrlSetData($Edt, DllCall('user32.dll', 'bool', 'OemToChar', 'str', $Out, 'str', $Out)[2])
 $Line = @ComSpec & " /c ping -t ya.ru"

Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $Btn
      StdinWrite($PID, DllCall('user32.dll', 'bool', 'CharToOem', 'str', $Line, 'str', $Line)[2] & @CRLF)
      Sleep(100)
   EndSwitch
   $Out = StdoutRead($PID)
      GUICtrlSetData($Edt, DllCall('user32.dll', 'bool', 'OemToChar', 'str', $Out, 'str', $Out)[2], 1)
Until 0

Аналогично и в оригинальном скрипте если нажать кнопку при выделенном тексте, он исчезает.

Ещё есть такая проблема как курсор. В оригинале текст писался в это поле между текстом, в то место где стоит курсор, хотя хотелось бы писать именно в конец.

В общем както нужно сделать чтоб при выделении текст не удалялся или не выделялся. Никаких функций для считывания кнопок мыши я не нашёл. Хорошо бы останавливать вывод когда курсор наведён или по активности формы или ещё чемуто

Русское сообщество AutoIt


Оффлайн Tempo [?]

  • Продвинутый
  • ***
  • Сообщений: 369
  • Репутация: 88
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Код: AutoIt [Выделить]
#include <GuiConstantsEx.au3>
#include <ScrollBarConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <ButtonConstants.au3>
#include <WinAPIMisc.au3>
#include <WinAPIProc.au3>
#include <WinAPI.au3>
Global Const $WA_ACTIVE = 1
Global Const $WA_CLICKACTIVE = 2
Global Const $WA_INACTIVE = 0
Global $hGUI, $iBtnStart, $iBtnStop, $iBtnPause, $iBtnUnPause, $iEdt, $iPID, $aPIDs, $sOut, $sLine = "ping -t 8.8.8.8" & @CRLF

$iPID = Run(@ComSpec, Null, @SW_HIDE, $STDIN_CHILD + $STDERR_MERGED)
OnAutoItExitRegister("_OnExit")
$hGUI = GUICreate("Пример")
$iBtnStart = GUICtrlCreateButton("Старт", 5, 5, 80, 25, $BS_DEFPUSHBUTTON)
$iBtnStop = GUICtrlCreateButton("Стоп", 90, 5, 80, 25)
GUICtrlSetState(-1, $GUI_DISABLE)
$iBtnPause = GUICtrlCreateButton("Пауза", 230, 5, 80, 25)
$iBtnUnPause = GUICtrlCreateButton("Продолжить", 315, 5, 80, 25)
GUICtrlSetState(-1, $GUI_DISABLE)
$iEdt = GUICtrlCreateEdit(Null, 5, 35, 390, 360, BitOR($ES_READONLY, $ES_AUTOVSCROLL, $WS_VSCROLL))
GUICtrlSendMsg(-1, $EM_LIMITTEXT, -1, 0)
GUIRegisterMsg($WM_ACTIVATE, "WM_ACTIVATE")
GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $iBtnStart
            GUICtrlSetState($iBtnStart, $GUI_DISABLE)
            GUICtrlSetState($iBtnStop, $GUI_ENABLE)
            StdinWrite($iPID, $sLine)
        Case $iBtnStop
            GUICtrlSetState($iBtnStop, $GUI_DISABLE)
            GUICtrlSetState($iBtnStart, $GUI_ENABLE)
            $aPIDs = _WinAPI_EnumChildProcess($iPID)
            If Not @error Then
                For $i = 1 To $aPIDs[0][0]
                    ProcessClose($aPIDs[$i][0])
                Next
            EndIf
        Case $iBtnPause
            GUICtrlSetState($iBtnPause, $GUI_DISABLE)
            GUICtrlSetState($iBtnUnPause, $GUI_ENABLE)
            AdlibUnRegister("_Update")
            GUIRegisterMsg($WM_ACTIVATE, Null)
        Case $iBtnUnPause
            GUICtrlSetState($iBtnUnPause, $GUI_DISABLE)
            GUICtrlSetState($iBtnPause, $GUI_ENABLE)
            AdlibRegister("_Update")
            GUIRegisterMsg($WM_ACTIVATE, "WM_ACTIVATE")
    EndSwitch
WEnd

Func WM_ACTIVATE($hWnd, $iMsg, $wParam, $lParam)
    Switch _WinAPI_LoWord($wParam)
        Case $WA_ACTIVE, $WA_CLICKACTIVE
            AdlibRegister("_Update")
        Case $WA_INACTIVE
            AdlibUnRegister("_Update")
    EndSwitch
EndFunc   ;==>WM_ACTIVATE

Func _Update()
    Local $vTemp = $sOut & _WinAPI_OemToChar(StdoutRead($iPID)), $aSel = GUICtrlRecvMsg($iEdt, $EM_GETSEL)
    If @error Or (Not @error And $aSel[0] = $aSel[1]) And $vTemp <> $sOut Then
        $sOut = $vTemp
        GUICtrlSetData($iEdt, $sOut)
        GUICtrlSendMsg($iEdt, $EM_SCROLL, $SB_BOTTOM, 0)
    EndIf
EndFunc   ;==>_Update

Func _OnExit()
    Local $aPIDs = _WinAPI_EnumChildProcess($iPID)
    If Not @error Then
        For $i = 1 To $aPIDs[0][0]
            ProcessClose($aPIDs[$i][0])
        Next
    EndIf
    ProcessClose($iPID)
EndFunc   ;==>_OnExit

« Последнее редактирование: Январь 01, 2018, 23:31:53 от Tempo »

Оффлайн winix [?]

  • Сообщений: 79

  • Автор темы
  • Репутация: -1
    • блог
    • Награды
  • Версия AutoIt: 3.3.12.0
Както можно сделать чтоб при выделенном тексте, данные не пропадали, а после снятия выделения возвращались в окно? Ну или хотябы чтоб выделение убиралось через какоето время.
Просто свернул окно с выделенным текстом и в итоге ничего не получил.

У меня будет несколько вкладок с такими окнами, должна быть возможность посмотреть что там происходит

Помечен как лучший ответ пользователем winix Отправлен Январь 15, 2018, 00:38:24

Оффлайн Tempo [?]

  • Продвинутый
  • ***
  • Сообщений: 369
  • Репутация: 88
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Код: AutoIt [Выделить]
#include <GuiConstantsEx.au3>
#include <ScrollBarConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <ButtonConstants.au3>
#include <WinAPIMisc.au3>
#include <WinAPIProc.au3>
#include <WinAPI.au3>
Global Const $WA_ACTIVE = 1
Global Const $WA_CLICKACTIVE = 2
Global Const $WA_INACTIVE = 0
Global $hGUI, $iBtnStart, $iBtnStop, $iBtnClean, $iBtnPause, $iBtnUnPause, $iEdt, $iPID, $aPIDs, $sOut, $iUnSel = 1, $sLine = "ping -t 8.8.8.8" & @CRLF

$iPID = Run(@ComSpec, Null, @SW_HIDE, $STDIN_CHILD + $STDERR_MERGED)
OnAutoItExitRegister("_OnExit")
$hGUI = GUICreate("Пример", 430)
$iBtnStart = GUICtrlCreateButton("Старт", 5, 5, 80, 25, $BS_DEFPUSHBUTTON)
$iBtnStop = GUICtrlCreateButton("Стоп", 90, 5, 80, 25)
GUICtrlSetState(-1, $GUI_DISABLE)
$iBtnClean = GUICtrlCreateButton("Очистить", 175, 5, 80, 25)
$iBtnPause = GUICtrlCreateButton("Пауза", 260, 5, 80, 25)
$iBtnUnPause = GUICtrlCreateButton("Продолжить", 345, 5, 80, 25)
GUICtrlSetState(-1, $GUI_DISABLE)
$iEdt = GUICtrlCreateEdit(Null, 5, 35, 420, 360, BitOR($ES_READONLY, $ES_AUTOVSCROLL, $WS_VSCROLL))
GUICtrlSendMsg(-1, $EM_LIMITTEXT, -1, 0)
GUIRegisterMsg($WM_ACTIVATE, "WM_ACTIVATE")
GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $iBtnStart
            GUICtrlSetState($iBtnStart, $GUI_DISABLE)
            GUICtrlSetState($iBtnStop, $GUI_ENABLE)
            StdinWrite($iPID, $sLine)
        Case $iBtnClean
            GUICtrlSetData($iEdt, Null)
            $sOut = Null
        Case $iBtnStop
            GUICtrlSetState($iBtnStop, $GUI_DISABLE)
            GUICtrlSetState($iBtnStart, $GUI_ENABLE)
            $aPIDs = _WinAPI_EnumChildProcess($iPID)
            If Not @error Then
                For $i = 1 To $aPIDs[0][0]
                    ProcessClose($aPIDs[$i][0])
                Next
            EndIf
        Case $iBtnPause
            GUICtrlSetState($iBtnPause, $GUI_DISABLE)
            GUICtrlSetState($iBtnUnPause, $GUI_ENABLE)
            AdlibUnRegister("_Update")
            GUIRegisterMsg($WM_ACTIVATE, Null)
        Case $iBtnUnPause
            GUICtrlSetState($iBtnUnPause, $GUI_DISABLE)
            GUICtrlSetState($iBtnPause, $GUI_ENABLE)
            AdlibRegister("_Update")
            GUIRegisterMsg($WM_ACTIVATE, "WM_ACTIVATE")
    EndSwitch
WEnd

Func WM_ACTIVATE($hWnd, $iMsg, $wParam, $lParam)
    Switch _WinAPI_LoWord($wParam)
        Case $WA_ACTIVE, $WA_CLICKACTIVE
            AdlibRegister("_Update")
        Case $WA_INACTIVE
            AdlibUnRegister("_Update")
    EndSwitch
EndFunc   ;==>WM_ACTIVATE

Func _Update()
    Local $vTemp = $sOut & _WinAPI_OemToChar(StdoutRead($iPID)), $aSel = GUICtrlRecvMsg($iEdt, $EM_GETSEL)
    If $vTemp <> $sOut Then
        $sOut = $vTemp
        $vTemp = 1
    Else
        $vTemp = 0
    EndIf
    If @error Or (Not @error And $aSel[0] = $aSel[1]) Then
        If $vTemp Then
            GUICtrlSetData($iEdt, $sOut)
            GUICtrlSendMsg($iEdt, $EM_SCROLL, $SB_BOTTOM, 0)
        EndIf
    Else
        If $iUnSel Then
            $iUnSel = 0
            AdlibRegister("_UnSel", 5000)
        EndIf
    EndIf
EndFunc   ;==>_Update

Func _UnSel()
    GUICtrlSendMsg($iEdt, $EM_SETSEL, -1, 0)
    GUICtrlSendMsg($iEdt, $EM_SCROLL, $SB_BOTTOM, 0)
    AdlibUnRegister("_UnSel")
    $iUnSel = 1
EndFunc   ;==>_UnSel

Func _OnExit()
    Local $aPIDs = _WinAPI_EnumChildProcess($iPID)
    If Not @error Then
        For $i = 1 To $aPIDs[0][0]
            ProcessClose($aPIDs[$i][0])
        Next
    EndIf
    ProcessClose($iPID)
EndFunc   ;==>_OnExit


Русское сообщество AutoIt

Re: Вывод консольного приложения в окно с авто обновлением
« Ответ #3 Отправлен: Январь 02, 2018, 13:12:33 »

Оффлайн winix [?]

  • Сообщений: 79

  • Автор темы
  • Репутация: -1
    • блог
    • Награды
  • Версия AutoIt: 3.3.12.0
Если выделить и свернуть, минут через 5 при попытке развернуть прогу, она падает.
Думал только со скриптом в scite память не хватает, там 32 эмуляция, а у меня прог много запущено.
Скомпилил под 64, вроде работала, а пока отходил от компа, такаяже фигня. Разворачиваю, она повисла и капут.
Хотя выделение всё таки отменяется сразу если окно не активно, просто остановлен вывод.

В общем отключил это чтоб вывод был постоянный
Код: AutoIt [Выделить]
Func WM_ACTIVATE($hWnd, $iMsg, $wParam, $lParam)
    Switch _WinAPI_LoWord($wParam)
        Case $WA_ACTIVE, $WA_CLICKACTIVE
            AdlibRegister("_Update")
       ; Case $WA_INACTIVE
       ;     AdlibUnRegister("_Update")
    EndSwitch
EndFunc   ;==>WM_ACTIVATE

какоето время работало свёрнутым. Когда развернул подвисло, в окне появилось сразу очень много и она продолжила работать.

Тут я подумал что если выводить эти данные в переменную, но не в окно. А потом вспомнил что в этом то и проблема,  видимо память кончается.
Попробую весь  день погонять, что будет.

OffTopicПомнится делал скрипт и пришлось все If заменять на Case из за проблем с производительностью. Кода стало раза в 2 больше. Возможно и тут так получится когда трей и вкладок навешаю, пока хотелось бы чтоб консолька нормально работала

Оффлайн Tempo [?]

  • Продвинутый
  • ***
  • Сообщений: 369
  • Репутация: 88
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
winix, с какой ошибкой в SciTE падает или на какой строке?

Оффлайн winix [?]

  • Сообщений: 79

  • Автор темы
  • Репутация: -1
    • блог
    • Награды
  • Версия AutoIt: 3.3.12.0
Просто падает молча
Цитировать
>"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "G:\home\Documents\Projects\autoit\aigui\test3.au3"   
>Exit code: 3221225477    Time: 2.975e+004
Выделил текст свернул часов на 8,  рядом запустил скомпиленый с отключеным кодом, где тоже выделил и свернул.
С отключенным после разворачивая нормально работает, этот повис, покрутил кружок на курсоре и вырубился, в общем как обычно.

Переписал под Case где смог, попробую погонять, но врятли чтото поменялось
Код: AutoIt [Выделить]
#include <GuiConstantsEx.au3>
#include <ScrollBarConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <ButtonConstants.au3>
#include <WinAPIMisc.au3>
#include <WinAPIProc.au3>
#include <WinAPI.au3>

AutoItSetOption("TrayAutoPause", 0)

Global Const $WA_ACTIVE = 1
Global Const $WA_CLICKACTIVE = 2
Global Const $WA_INACTIVE = 0
Global $hGUI, $iBtnStart, $iBtnStop, $iBtnClean, $iBtnPause, $iBtnUnPause, $iEdt, $iPID, $aPIDs, $sOut, $iUnSel = 1
$sLine = "ping -t 8.8.8.8" & @CRLF

$iPID = Run(@ComSpec, Null, @SW_HIDE, $STDIN_CHILD + $STDERR_MERGED)
OnAutoItExitRegister("_OnExit")

$hGUI = GUICreate("Пример", 660)
$iBtnStart = GUICtrlCreateButton("Старт", 5, 5, 80, 25, $BS_DEFPUSHBUTTON)
$iBtnStop = GUICtrlCreateButton("Стоп", 90, 5, 80, 25)
GUICtrlSetState(-1, $GUI_DISABLE)
$iBtnClean = GUICtrlCreateButton("Очистить", 175, 5, 80, 25)
$iBtnPause = GUICtrlCreateButton("Пауза", 260, 5, 80, 25)
$iBtnUnPause = GUICtrlCreateButton("Продолжить", 345, 5, 80, 25)
GUICtrlSetState(-1, $GUI_DISABLE)
$iEdt = GUICtrlCreateEdit(Null, 5, 35, 650, 360, BitOR($ES_READONLY, $ES_AUTOVSCROLL, $WS_VSCROLL))

GUICtrlSendMsg(-1, $EM_LIMITTEXT, -1, 0)
GUIRegisterMsg($WM_ACTIVATE, "WM_ACTIVATE")
GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
         Case $iBtnStart
            GUICtrlSetState($iBtnStart, $GUI_DISABLE)
            GUICtrlSetState($iBtnStop, $GUI_ENABLE)
            StdinWrite($iPID, $sLine)
        Case $iBtnClean
            GUICtrlSetData($iEdt, Null)
            $sOut = Null
        Case $iBtnStop
            GUICtrlSetState($iBtnStop, $GUI_DISABLE)
            GUICtrlSetState($iBtnStart, $GUI_ENABLE)
            $aPIDs = _WinAPI_EnumChildProcess($iPID)

   Select
      Case Not @error
         For $i = 1 To $aPIDs[0][0]
            ProcessClose($aPIDs[$i][0])
         Next
   EndSelect

        Case $iBtnPause
            GUICtrlSetState($iBtnPause, $GUI_DISABLE)
            GUICtrlSetState($iBtnUnPause, $GUI_ENABLE)
            AdlibUnRegister("_Update")
            GUIRegisterMsg($WM_ACTIVATE, Null)
        Case $iBtnUnPause
            GUICtrlSetState($iBtnUnPause, $GUI_DISABLE)
            GUICtrlSetState($iBtnPause, $GUI_ENABLE)
            AdlibRegister("_Update")
            GUIRegisterMsg($WM_ACTIVATE, "WM_ACTIVATE")
    EndSwitch
WEnd

;!
Func WM_ACTIVATE($hWnd, $iMsg, $wParam, $lParam)
    Switch _WinAPI_LoWord($wParam)
        Case $WA_ACTIVE, $WA_CLICKACTIVE
            AdlibRegister("_Update")
        Case $WA_INACTIVE ;!
            AdlibUnRegister("_Update") ;!
    EndSwitch
EndFunc   ;==>WM_ACTIVATE

Func _Update()
    Local $vTemp = $sOut & _WinAPI_OemToChar(StdoutRead($iPID)), $aSel = GUICtrlRecvMsg($iEdt, $EM_GETSEL)

Select
    Case $vTemp <> $sOut
         $sOut = $vTemp
         $vTemp = 1
    Case Else
         $vTemp = 0
EndSelect

    If @error Or (Not @error And $aSel[0] = $aSel[1]) Then

Select
    Case $vTemp
         GUICtrlSetData($iEdt, $sOut)
         GUICtrlSendMsg($iEdt, $EM_SCROLL, $SB_BOTTOM, 0)
EndSelect

      Else

Select
    Case $iUnSel
         $iUnSel = 0
         AdlibRegister("_UnSel", 5000)
EndSelect

    EndIf

EndFunc   ;==>_Update

Func _UnSel()
    GUICtrlSendMsg($iEdt, $EM_SETSEL, -1, 0)
    GUICtrlSendMsg($iEdt, $EM_SCROLL, $SB_BOTTOM, 0)
    AdlibUnRegister("_UnSel")
    $iUnSel = 1
EndFunc   ;==>_UnSel

Func _OnExit()
    Local $aPIDs = _WinAPI_EnumChildProcess($iPID)

   Select
      Case Not @error
         For $i = 1 To $aPIDs[0][0]
            ProcessClose($aPIDs[$i][0])
         Next
   EndSelect

    ProcessClose($iPID)
EndFunc   ;==>_OnExit

« Последнее редактирование: Январь 04, 2018, 17:37:11 от winix »

Оффлайн Tempo [?]

  • Продвинутый
  • ***
  • Сообщений: 369
  • Репутация: 88
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
winix, может будет лучше время от времени чистить переменную или вовсе писать только в Edit. И еще если вы не собираетесь постоянно его мониторить может лучше будет писать в файл?

Русское сообщество AutoIt

Re: Вывод консольного приложения в окно с авто обновлением
« Ответ #7 Отправлен: Январь 04, 2018, 17:59:28 »

Оффлайн winix [?]

  • Сообщений: 79

  • Автор темы
  • Репутация: -1
    • блог
    • Награды
  • Версия AutoIt: 3.3.12.0
Думаю вырезать функцию останова, тем более это тормозит весь скрипт, а должно быть несколько потоков (ну да язык однопоточный)
Всётаки удалось заставить его выдать хоть чтото когда сделал ему
Код: AutoIt [Выделить]
Dim $sOut

через время выдало ошибку, но заметил только когда развернул окно. Работал из бинарника потомучто редактор занят был, так что ошибку не видел если была.
Цитировать
---------------------------
AutoIt
---------------------------
Error allocating memory.
---------------------------
ОК   
---------------------------
Очищать может и хорошо бы тоже автоматизировать. Но у меня с отключенной остановкой уже 15 часов работает, 12к строк, 860к знаков.
С логами всё сложно. Какимто я могу указать файл в параметрах, но в других есть только вывод в окно, так что брать надо будет из него.
А у какихто вывод в окно меняется и их в файл не отправить без потери информативности, можно только отправлять снимок экрана, фактически весь текст с начала запуска, тогда он будет точным. Но это редкие проги у них есть вывод в лог.
OffTopicВ будущем будет автоматизация консолей, так что можно будет и очистку по расписанию приделать. Будет слежение за работай процесса, если он откинется его перезапустят.
Ну и в идеале следить что он выдаёт и от чего упал, если некоторую ошибку, то выполнить другую команду для устранения проблемы
---
Нашёл как стабильно ронять скрипт в любом случае даже с закоментированым куском. Файлов столько что он сразу валится, в случае scite только успевает пикнуть ошибку. Видимо надо какоето ограничение на количество знаков
Код: AutoIt [Выделить]
$sLine = @ComSpec & " /c dir c:\windows\system32" & @CRLF


Тут ещё поменял это
Код: AutoIt [Выделить]
Local $vTemp = $sOut & _WinAPI_OemToChar(StdoutRead($iPID)), $aSel = GUICtrlRecvMsg($iEdt, $EM_GETSEL)

на это
Код: AutoIt [Выделить]
Local $vTemp = $sOut & DllCall('user32.dll', 'bool', 'OemToChar', 'str', StdoutRead($iPID), 'str', StdoutRead($iPID))[2]

в общем никакой разницы
---
Попытка узнать длинну строки через StringLen ( $vTemp ) ничего не дала , возможно строка возвращаемая самим StdoutRead($iPID) слишком длинная и падает он, но один раз вписать её в файл длинной 30к знаков получилось.
Написал батник@echo off
:else11
echo %random%%random%
goto else11
функция OnAutoItExitRegister показала свою никчёмность. Сам cmd она не останавливает, а останавливает только запущенный им процесс, но если этот процесс файл самого сmd, то есть bat, то он спокойно продолжает работать и после нажатия стопа данные в окне продолжают обновляться, после чего прога и падает.

В общем имеем 2 проблемы. Как через exe получить много построчных данных для проверки, батник тут не подходит.
И как ограничить получаемые данные через StdoutRead если от слишком длинной строки он сам падает.

Странная работа проги. Не процесс запускается через cmd, а сам cmd запущен при запуске самого скрипта, а команда уже скармливается ему
« Последнее редактирование: Январь 06, 2018, 06:59:50 от winix »

Оффлайн winix [?]

  • Сообщений: 79

  • Автор темы
  • Репутация: -1
    • блог
    • Награды
  • Версия AutoIt: 3.3.12.0
Написал очистку переменной при превышении 600к знаков с сохранением этого в отдельный файл, но это ничего не дало, только тормозить стало меньше от забитого окна.
(нажмите для показа/скрытия)
Видимо дело в том что принцип основан на получении всего содержимого окна за раз, а не построчно.

Поскольку запустить батник толком нельзя и надо exe, написал 2 консольных костыля.
Взвращает длинную строку
Код: AutoIt [Выделить]
for $i = 0 to 200000
local $sString =Random(0, 9, 1)
ConsoleWrite($sString )
Local $strl5 =  StringLen ( $sString )
next

Понять логику работы не получилось, её просто нет. Есть факт тоги что размер строки которую может принять программа постоянно уменьшается, с каждым запуском программы не зависимо не от чего
(нажмите для показа/скрытия)
Итого максимальная длинна строки которую программа может прочитать однократно из stout от >40к до ≈20к , но стабильно 1400 знаков. При повторном запросе программа скорее всего упадёт даже если окно очищено.

Код: AutoIt [Выделить]
for $n=0 to 20000
for $i = 0 to 150
local $sString =Random(0, 9, 1)
ConsoleWrite($sString )
Local $strl5 =  StringLen ( $sString )
next
ConsoleWrite(@CRLF )
next

В последних испытаниях много строк длинной 150 знаков, чуть  более реалистичный вариант, как раз консольная программа выдаёт строки около 100 знаков, но не каждый раз.
Получалось около 4 файлов по 600 знаков. Таких циклов программа могла выдать 2, или может 3 иногда. После чего как и обычно падает.

Сейчас тестирую с реальной прогой. Работает уже дня 2 , создано 4 файла по 600 знаков. Но это программа бесконечная, так что на сколько её хватит ещё неизвестно.
Когда скрипт падает, программа продолжит работать в фоне. Думаю может попытаться подключится к  ней по известному PID процесса

Русское сообщество AutoIt

Re: Вывод консольного приложения в окно с авто обновлением
« Ответ #9 Отправлен: Январь 08, 2018, 09:27:17 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
2 Ответов
3391 Просмотров
Последний ответ Февраль 09, 2011, 16:14:48
от Yashied
2 Ответов
4190 Просмотров
Последний ответ Февраль 22, 2011, 16:43:58
от VladUs
9 Ответов
3590 Просмотров
Последний ответ Март 01, 2012, 10:43:33
от Odinn
7 Ответов
4253 Просмотров
Последний ответ Август 23, 2012, 11:46:45
от DarWiM
17 Ответов
5972 Просмотров
Последний ответ Май 16, 2013, 14:39:51
от Black_Sunlight
13 Ответов
6573 Просмотров
Последний ответ Август 17, 2015, 09:56:23
от Yashied
1 Ответов
1018 Просмотров
Последний ответ Март 27, 2015, 13:58:41
от gloss
3 Ответов
628 Просмотров
Последний ответ Август 16, 2017, 20:26:03
от Kasper
1 Ответов
322 Просмотров
Последний ответ Ноябрь 18, 2017, 01:29:39
от mrPuh
2 Ответов
158 Просмотров
Последний ответ Апрель 07, 2018, 16:26:04
от avmaksimov