На днях захотелось сделать оболочку для командной строки, наиболее удобно как мне показалось это сделать через StdoutRead. Да и захотелось разобраться с потоками. Но в процессе столкнулся с такими проблемами:
1) Как эффективно прервать поток, если он выполняется очень долго или он изначально бесконечный (например, "ping" с параметром -t )
2) Найти аналог ProcessWaitClose, при котором можно определить окончание выполнения команды и при этом данные получать по мере их получения (по умолчанию). Если использую ProcessWaitClose, то данные поступают только после окончания.
Вот пример кода:
Заранее благодарю за оказанную помощь...
1) Как эффективно прервать поток, если он выполняется очень долго или он изначально бесконечный (например, "ping" с параметром -t )
2)
Вот пример кода:
Код:
;#Include <Constants.au3>
;#Include <EditConstants.au3>
#Include <GUIConstantsEx.au3>
#Include <GUIEdit.au3>
#Include <ComboConstants.au3>
#Include <WindowsConstants.au3>
#Include <Encoding.au3>
$hGUI = GUICreate('CustomCMD', 600, 400)
$comand_label = GUICtrlCreateLabel("Команда: ", 16, 11, 55, 17)
$Combo = GUICtrlCreateCombo("Выберите команду", 80, 8, 401, 25, $CBS_DROPDOWNLIST + $WS_VSCROLL)
GUICtrlSetData(-1, "ping ya.ru|ping ya.ru -t|tracert ya.ru", "ping ya.ru")
$btn_Run = GUICtrlCreateButton("Старт", 496, 6, 89, 25)
$btn_Stop = GUICtrlCreateButton("Стоп", 496, 6, 89, 25)
GUICtrlSetState(-1, $GUI_HIDE)
$Console = GUICtrlCreateEdit('', 0, 50, 600, 350, BitOR($ES_AUTOVSCROLL, $ES_READONLY, $ES_WANTRETURN, $WS_VSCROLL))
GUICtrlSetFont(-1, 9, 400, 0, 'Courier New')
GUICtrlSetBkColor(-1, 0)
GUICtrlSetColor(-1, 0x00D000)
_GUICtrlEdit_SetLimitText(-1, 8 * 1024 * 1024) ; 8 MB (ANSI)
GUISetState()
;$Config = IniReadSection("option.ini", "combobox")
;If @error Then
; MsgBox(4096, "Error", "Ошибка чтения INI файла.")
;Else
; For $i = 1 To $Config[0][0]
; GUICtrlSetData($Combo, $Config[$i][1] )
; Next
;EndIf
While 1
Local $iPid
$aRead = StdoutRead($iPid)
If $aRead Then
GUICtrlSetData($Console, GUICtrlRead($Console) & _Encoding_CyrillicTo1251($aRead))
EndIf
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $btn_Run
$iPid = Run(@ComSpec & " /c " & StringReplace(GUICtrlRead($Combo), '"', '""'), @ScriptDir, Default, 2)
GUISetCursor(1, 1)
GUICtrlSetState($btn_Run, $GUI_HIDE)
GUICtrlSetState($btn_Stop, $GUI_SHOW)
GUICtrlSetState($Combo, $GUI_DISABLE)
GUICtrlSetData($Console, '')
ProcessWaitClose($iPID)
GUISetCursor(2, 0)
GUICtrlSetState($btn_Run, $GUI_SHOW)
GUICtrlSetState($btn_Stop, $GUI_HIDE)
GUICtrlSetState($Combo, $GUI_ENABLE)
Case $btn_Stop
MsgBox(4096, "Stop", "Stop")
ProcessClose($iPid)
EndSwitch
Wend
Заранее благодарю за оказанную помощь...