purebasic.info

PureBasic forum
Текущее время: Вт ноя 19, 2019 2:15 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: ReadProgramError - баг или нет ?
СообщениеДобавлено: Сб ноя 02, 2019 3:58 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 466
Благодарил (а): 51 раз.
Поблагодарили: 21 раз.
Пункты репутации: 10
Здравствуйте.

Подскажите пожалуйста, как у вас работает/выглядит результат ReadProgramError() ?
Вот простой код:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
prog = RunProgram("robocopy", "c:\YYY\55 c:\YYY\22 /S /TEE", "", #PB_Program_Open|#PB_Program_Read|#PB_Program_Error)
If prog
  While ProgramRunning(prog)
    If AvailableProgramOutput(prog)
      Debug ReadProgramError(prog, #PB_Ascii)
      ;stderr$ = ReadProgramError(prog, #PB_Ascii)
      ;Debug stderr$
     
      ;stdout$ = ReadProgramString(prog, #PB_Ascii)
      ;Debug stdout$
    EndIf
  Wend
EndIf


Вопрос №1: Почему в таком виде получается бесконечный цикл. Допустим меня интересует только поток данных с ошибками. Но стоит расскоментировать строку №9 и программа начинает отрабатывать корректно.
Вопрос №2: Почему не работает присвоение строковой переменной(если закомментировать стоку №5 и раскомментировать соответственно две последующие)? В таком случае Debug stderr$ выводит пустые строки.
Вопрос №3: Скажите пожалуйста, а что использование в программе #PB_Program_Read и #PB_Program_Error перехватывает/перенаправляет потоки stdout и stderr? Есть ли возможность читать их и при этом не влиять на выводимую программой информацию? В данном случае robocopy перестаёт печатать в консоль, как при запуске из bat'ника. А хотелось бы сохранить это дело, так как там проценты(выполнено) для каждого файла "бегут". Поэтому PrintN(stdout$) не подходит.

Спасибо за внимание.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ReadProgramError - баг или нет ?
СообщениеДобавлено: Ср ноя 06, 2019 4:20 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 339
Благодарил (а): 14 раз.
Поблагодарили: 41 раз.
Пункты репутации: 2
Бесконечный цикл из-за #PB_Program_Read из справки:
Цитата:
Если программа была запущена с флагом #PB_Program_Read, она будет возвращать ненулевое значение, если есть что прочитать, даже если программа уже завершена.
ReadProgramString читает до конца -> ProgramRunning возвращает 0. Но, работает явно странно, у меня ReadProgramError возвращает то, что должна возвращать ReadProgramString, вместо ошибки или пустой строки в случае отсутствия ошибок.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ReadProgramError - баг или нет ?
СообщениеДобавлено: Чт ноя 07, 2019 12:45 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 466
Благодарил (а): 51 раз.
Поблагодарили: 21 раз.
Пункты репутации: 10
repeat, спасибо за ответ.
Цитата:
Бесконечный цикл из-за #PB_Program_Read

Это уже понял. Есть ещё неточности в коде:
По набору ключей для robocopy и чтению ошибок (должно производиться вне If AvailableProgramOutput(prog)). Но это никоим образом не влияет на результат.
Цитата:
у меня ReadProgramError возвращает то, что должна возвращать ReadProgramString

Похоже, что stderr дублирует stdout. И этот вопрос относится уже скорее "к robocopy" (может они "запараллелены").
Но больше всего меня интересовал 3-й вопрос. Сейчас, если запустить из командной строки или bat'ника robocopy с указанными параметрами, то будет возможность наблюдать в консольном окне ход процесса. Напротив, если запустить из PB (RunProgram), то увидим лишь чёрный экран консоли. Для пользователя всё должно остаться в неизменном виде(как при запуске из bat'ника), но при этом иметь возможность читать stderr и stdout. То, о чём спрашиваю можно образно представить себе как сплиттер ТВ-сигнала, когда один вход нужно поделить между двумя "телеками". Есть такая возможность в PB?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ReadProgramError - баг или нет ?
СообщениеДобавлено: Чт ноя 07, 2019 2:54 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 339
Благодарил (а): 14 раз.
Поблагодарили: 41 раз.
Пункты репутации: 2
На крайний случай :roll:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
prog = RunProgram("robocopy", "c:\YYY\55 c:\YYY\22 /S /TEE", "", #PB_Program_Open|#PB_Program_Read|#PB_Program_Error|#PB_Program_Hide)
progcmd = RunProgram("cmd", "", "", #PB_Program_Open|#PB_Program_Write)
If prog
  While ProgramRunning(prog)
    If AvailableProgramOutput(prog)    
      stdout$ = ReadProgramString(prog, #PB_Ascii)
      WriteProgramStringN(progcmd, stdout$)
      Debug stdout$
    EndIf
  Wend
  CloseProgram(progcmd)
  CloseProgram(prog)
EndIf



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ReadProgramError - баг или нет ?
СообщениеДобавлено: Чт ноя 07, 2019 3:35 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 466
Благодарил (а): 51 раз.
Поблагодарили: 21 раз.
Пункты репутации: 10
repeat, спасибо конечно. Но... нет, это не то. С таким же успехом мог использовать OpenConsole() и PrintN(stdout$). В первом посте говорил, что такой вариант неприемлем. Так как это не будет идентично тому выводу robocopy, что в оригинале. И следовательно пользователь увидит разницу. Дело в том, что при копировании довольно объёмного файла в оригинальном консольном окне "бегут" проценты рядом с каждым файлом (слева). ReadProgramString() же возвращает строки типа:
Цитата:
Новый файл 6.3 m 01 Feeling Good.mp3 0.0% 7.9% 15.8% 23.7% 31.6% 39.5% 47.4% 55.3% 63.2% 71.1% 79.0% 86.9% 94.8%100%
Новый файл 8.4 m 02 Forget You.mp3 0.0% 11.7% 23.5% 35.3% 47.0% 58.8% 70.6% 82.4% 94.1%100%

Получается, что помимо решения осн. задачи также нужно в фэйковой консоли следить за процентами. Этого -то и хотелось избежать. Иначе даже не имеет смысла заморачиваться(слишком много операций над строками). Нужно, чтобы оригинальное консольное окно robocopy "жило своей жизнью", а PB при этом параллельно читал потоки. Вот и всё, что требуется.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ReadProgramError - баг или нет ?
СообщениеДобавлено: Пт ноя 08, 2019 2:06 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 339
Благодарил (а): 14 раз.
Поблагодарили: 41 раз.
Пункты репутации: 2
Может GetStdHandle_() заслать robocopy и перенаправить вывод обратно. :? ?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ReadProgramError - баг или нет ?
СообщениеДобавлено: Пт ноя 08, 2019 5:38 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 339
Благодарил (а): 14 раз.
Поблагодарили: 41 раз.
Пункты репутации: 2
Например так:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
Import "Kernel32.lib"
  AttachConsole_(pid.l) As "_AttachConsole@4"
EndImport
 
stdout$ = Space(1024)
 
prog.l = RunProgram("robocopy", "c:\YYY\55 c:\YYY\22 /S /TEE", "", #PB_Program_Open|#PB_Program_Read|#PB_Program_Write|#PB_Program_Error)
If prog
  pid.l = ProgramID(prog)
  Delay(1000)
  AttachConsole_(pid)
  hStd = GetStdHandle_(#STD_OUTPUT_HANDLE)
  While ProgramRunning(prog)
    If AvailableProgramOutput(prog)
      ReadProgramData(prog, @stdout$, 1024)
      len.l = Len(stdout$)
      WriteConsole_(hStd, @stdout$, len, @lpNumberOfCharsWritten, 0)
      Debug stdout$
    EndIf
  Wend
  CloseProgram(prog)
EndIf



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: ReadProgramError - баг или нет ?
СообщениеДобавлено: Сб ноя 09, 2019 11:34 am 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 466
Благодарил (а): 51 раз.
Поблагодарили: 21 раз.
Пункты репутации: 10
repeat, ещё раз говорю Вам: - спасибо БОЛЬШОЕ! за попытку помочь, но всё-таки нет. Получаются полумеры какие-то. Видимо остаётся надеяться только на Фреда, если он конечно посчитает нужным добавить такую возможность. Есть ещё программа, которая хорошо иллюстрирует то, что нужно. Это продукт от Eltima - Serial Port Splitter (не реклама!). Так же и тут, нужно как бы "расщепить" выходные потоки.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Bing [Bot] и гости: 15


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB