Что нового

Вывод консольного приложения в окно с авто обновлением

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

Попробовал убрать вывод из обработки кнопки в общий цикл, вроде бы работает, но при попытке выделить текст, всё что сначало выделения и до конца исчезает.
Код:
$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

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

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

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

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Код:
#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
 
Автор
W
Сообщения
80
Репутация
-1
Както можно сделать чтоб при выделенном тексте, данные не пропадали, а после снятия выделения возвращались в окно? Ну или хотябы чтоб выделение убиралось через какоето время.
Просто свернул окно с выделенным текстом и в итоге ничего не получил.

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

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Код:
#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
 
Автор
W
Сообщения
80
Репутация
-1
Если выделить и свернуть, минут через 5 при попытке развернуть прогу, она падает.
Думал только со скриптом в scite память не хватает, там 32 эмуляция, а у меня прог много запущено.
Скомпилил под 64, вроде работала, а пока отходил от компа, такаяже фигня. Разворачиваю, она повисла и капут.
Хотя выделение всё таки отменяется сразу если окно не активно, просто остановлен вывод.

В общем отключил это чтоб вывод был постоянный
Код:
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

AutoIT Гуру
Сообщения
616
Репутация
205
winix, с какой ошибкой в SciTE падает или на какой строке?
 
Автор
W
Сообщения
80
Репутация
-1
Просто падает молча
>"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 где смог, попробую погонять, но врятли чтото поменялось
Код:
#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
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
winix, может будет лучше время от времени чистить переменную или вовсе писать только в Edit. И еще если вы не собираетесь постоянно его мониторить может лучше будет писать в файл?
 
Автор
W
Сообщения
80
Репутация
-1
Думаю вырезать функцию останова, тем более это тормозит весь скрипт, а должно быть несколько потоков (ну да язык однопоточный)
Всётаки удалось заставить его выдать хоть чтото когда сделал ему
Код:
Dim $sOut
через время выдало ошибку, но заметил только когда развернул окно. Работал из бинарника потомучто редактор занят был, так что ошибку не видел если была.
---------------------------
AutoIt
---------------------------
Error allocating memory.
---------------------------
ОК
---------------------------
Очищать может и хорошо бы тоже автоматизировать. Но у меня с отключенной остановкой уже 15 часов работает, 12к строк, 860к знаков.
С логами всё сложно. Какимто я могу указать файл в параметрах, но в других есть только вывод в окно, так что брать надо будет из него.
А у какихто вывод в окно меняется и их в файл не отправить без потери информативности, можно только отправлять снимок экрана, фактически весь текст с начала запуска, тогда он будет точным. Но это редкие проги у них есть вывод в лог.
OffTopic:
В будущем будет автоматизация консолей, так что можно будет и очистку по расписанию приделать. Будет слежение за работай процесса, если он откинется его перезапустят.
Ну и в идеале следить что он выдаёт и от чего упал, если некоторую ошибку, то выполнить другую команду для устранения проблемы

---
Нашёл как стабильно ронять скрипт в любом случае даже с закоментированым куском. Файлов столько что он сразу валится, в случае scite только успевает пикнуть ошибку. Видимо надо какоето ограничение на количество знаков
Код:
$sLine = @ComSpec & " /c dir c:\windows\system32" & @CRLF


Тут ещё поменял это
Код:
Local $vTemp = $sOut & _WinAPI_OemToChar(StdoutRead($iPID)), $aSel = GUICtrlRecvMsg($iEdt, $EM_GETSEL)
на это
Код:
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 запущен при запуске самого скрипта, а команда уже скармливается ему
 
Автор
W
Сообщения
80
Репутация
-1
Написал очистку переменной при превышении 600к знаков с сохранением этого в отдельный файл, но это ничего не дало, только тормозить стало меньше от забитого окна.
Код:
Select ; очищать окно с сохранением в файл
Case $strl4 > 600000
   Local $nFile = @WorkingDir & "\tmp\zLog" & @YEAR & @MON & @MDAY & "." & @MIN & @SEC & ".txt"
   $hFile = FileOpen($nFile, 1)
   FileWrite($hFile, $sOut & @CRLF & ">" & $strl4 & "<")
   FileClose($hFile)
   _debug_send_file()
   $sOut = "Превышено " & $strl4 & " знаков." & @CRLF & "Прошлый вывод сохранён в " & $nFile & @CRLF
   $strl4 = 0
EndSelect
вписывается перед
$vTemp = 1
Видимо дело в том что принцип основан на получении всего содержимого окна за раз, а не построчно.

Поскольку запустить батник толком нельзя и надо exe, написал 2 консольных костыля.
Взвращает длинную строку
Код:
for $i = 0 to 200000
local $sString =Random(0, 9, 1)
ConsoleWrite($sString )
Local $strl5 =  StringLen ( $sString )
next
Понять логику работы не получилось, её просто нет. Есть факт тоги что размер строки которую может принять программа постоянно уменьшается, с каждым запуском программы не зависимо не от чего
; 389778 > 390221 390570.
; 389777 > 390885
; 389776 > 390578 390525
; 378770 > 39257 39246 39278 379193 o379380 379255
; 368770 > 369438 369448 . 369275
; 378770 > 379174 379644 o379167
Слева заданное число строки, справа результаты вывода в окно (к строке добавлялась длинна, зависит от скорости опроса окна процессором).
Как видно это число постоянно пришлось уменьшать чтоб программа перестала падать.

Сначало я перезапускал scite, потом подменил exe 32 на 64 чтоб scite запускал с ним, подумал что не хватает памяти syswow . Пробовал перезагружать комп и компилировать прогу, всё это бесполезно.

Причём падает каким угодно способом в зависимости от длинны строки получаемой от команды.
Это может быть падение без ошибки, падение с 2 окнами ошибки о нехватки памяти(в некотором диапазоне длинны строки), или падение с одним окном ошибки.

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

Код:
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 процесса
 
Верх