Форум программистов, компьютерный форум, киберфорум
Pure Basic
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 48
1

RunProgram and #PB_Program_Error

17.11.2021, 21:59. Показов 4115. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую!
Столкнулся с проблемой контроля вывода ошибок от консольного приложения.
Имеется какое то ограничение по длине, парсю в цикле, но если длина больше определённой, то программа на пьюрике, тормозит консольную утилиту наглухо... Причем даже если не парсю, а просто при запуске имеется константа #PB_Program_Error, консольная программа зависает, если отдаёт слишком много данных...
Вопрос: Есть какое то ограничение считывания вывода ошибок stderr в пьюрбейсике
В сmd то всё отображается корректно (без пьюрика)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.11.2021, 21:59
Ответы с готовыми решениями:

RunProgram
добрый день, вопрос может не совсем про пурик но всеже я в нем это делаю cmd.s = "/c ping 192.168.0.1" ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
23
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,253
Записей в блоге: 4
18.11.2021, 13:53 2
Когда создаёте процесс и указываете какую‐нибудь константу #PB_Program_, то среда исполнения перенаправляет трубопровод к вам. Программа по ту сторону трубопроводов вызывает WriteFile на стандартный поток и ждёт когда байты будут прочитаны.

Логично, что вы должны выбрать что‐то одно:
* прочитать эти данные
* не перенаправлять трубопровод, то есть не указывать #PB_Program_Error
* закрыть трубопровод (в PureBasic вы не можете закрыть конкретный трубопровод, вы можете только закрыть всю программу через СloseProgram(), но тогда зачем открывали, если не собираетесь читать).
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 48
18.11.2021, 14:13  [ТС] 3
Замабувараев, Спасибо, но это не ответ на мой вопрос.
Хотя...
стандартный поток и ждёт когда байты будут прочитаны
так вот пьюрик и не справляется...
Вопрос был в том, если ограничения чтения буфера ошибок, так как выше определённого, он не читается...
И можно это как то обойти используя WinAPI...
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,253
Записей в блоге: 4
18.11.2021, 14:17 4
А как вы читаете данные из трубопровода?
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 48
18.11.2021, 14:33  [ТС] 5
Замабувараев, Пытался несколькими способами, да хоть Debug ReadProgramError(iPid)
Хотя у меня в коде считывается в цикле. Но я отключал эту функцию...

Добавлено через 7 минут
Цитата Сообщение от CryptoNickSoft Посмотреть сообщение
ждёт когда байты будут прочитаны
Походу не ждёт.. Убираю из кода считывание данных stderr, но оставляю константу в строке запуска #PB_Program_Error
если буфер ошибок небольшой (выводится мало инфы), то всё завершается удачно, если большой, то консольная утиль виснет...
0
49 / 47 / 3
Регистрация: 06.11.2010
Сообщений: 155
Записей в блоге: 1
18.11.2021, 16:34 6
для #PB_Program_Error в справке написано что не приостанавливает. На сколько я понимаю есть 3 потока, утиль пишет в поток передачи данных (назовём пока так не цепляясь за аббревиатуры) и также пишет в поток ошибок. Когда прога считывает данные, она также читает поток ошибок, а уже юзер определяет читать ли поток данных дальше, если прога выдала в поток ошибок ошибки. То есть чтение данных работает как приостановка программы, оно не даёт напрячь проц на максималку, так как ждёт от проги новые данные. Если этого потока нет, а в потоке ошибок нет ожиданий, то и результат наверно всё виснет потому что прога приёмник пытается миллиард раз в микросекунду читать поток ошибок. Конечно всё зависнет. Поток ошибок является сопровождением потока данных и валидностью данных.
0
 Аватар для Pro_grammer
6807 / 2837 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
18.11.2021, 16:37 7
Цитата Сообщение от CryptoNickSoft Посмотреть сообщение
да хоть Debug ReadProgramError(iPid)
Вы бы выложили если не кусок реального кода, то хотя бы его прототип, на котором видно структуру кода.
Например так:
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
Process = RunProgram("C:\xxx.exe","", GetCurrentDirectory(), #PB_Program_Open | #PB_Program_Read | #PB_Program_Error | #PB_Program_Write)
If Process
  While  ProgramRunning(Process)
    If AvailableProgramOutput(Process)
      Debug ReadProgramString(Process)
    EndIf
    Error$ = ReadProgramError(Process)
    If Len(Error$) > 0
      Debug Error$
    EndIf
  Wend
  ProgramExitCode(Process)
EndIf
1
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 48
18.11.2021, 18:03  [ТС] 8
Pro_grammer, ReadProgramError(Process) мне приходится не единожды запускать в цикле, пока не получу все строки... но дело в том, что до этого не доходит, если данных много..
с примером всё сложно... так как нужно писать какую то свою консольную утилиль на Ascii которая выдаёт много данных в поток... код опроса у меня такой:
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Procedure RunConsole(File$, Parameter$, WorkingDirectory$, Flags=0)
  Protected FileName$ = LCase(GetFilePart(File$, #PB_FileSystem_NoExtension)) ;+" & Pause"
  Protected iPid = RunProgram("cmd.exe", "/c "+File$+" "+Parameter$, WorkingDirectory$, #PB_Program_Open | #PB_Program_Read | #PB_Program_Error | #PB_Program_Hide) ;  
  ;Protected iPid = RunProgram(File$, Parameter$, WorkingDirectory$, #PB_Program_Open | #PB_Program_Read | #PB_Program_Error | #PB_Program_Hide) 
  Protected Str$, stderr$, Ret = -300, iByteLength, sOem_in_Ascii$, sunicode$, stderrOut$                                                                                                                     
  If iPid
    
    While ProgramRunning(iPid)
      Str$=ReadProgramStringOem(iPid)
      If Str$
        Str$ = stdOutString(FileName$, Str$)
        Message(Cn(Str$))
      EndIf
    Wend
 
    While #True
      stderr$ = ReadProgramError(iPid,  #PB_Ascii)
      If stderr$ ;Ascii
        
        If FileName$= "make_ext4fs" Or FileName$= "imgextractor";Ansii
          stderrOut$+stderr$+Chr(13)
        Else ;Oem
          iByteLength = Len(stderr$) + 2     
          sOem_in_Ascii$ = Space(iByteLength)
          PokeS(@sOem_in_Ascii$, stderr$, -1, #PB_Ascii)
          sunicode$ = Space(iByteLength)
          OemToChar_(@sOem_in_Ascii$, @sunicode$)
          stderrOut$+sunicode$+Chr(13)
        EndIf
        
        stderrOut$ = stdErrString(FileName$, stderrOut$)
        Message(Cn(stderrOut$))
      Else 
        Break
      EndIf
    Wend
 
    Ret = ProgramExitCode(iPid)
    CloseProgram(iPid) ;Close the connection to the program 
  EndIf
  ProcedureReturn Ret
EndProcedure
но если много данных в stderr, до считывания и дело не доходит.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,253
Записей в блоге: 4
18.11.2021, 18:29 9
Цитата Сообщение от CryptoNickSoft Посмотреть сообщение
до считывания и дело не доходит
Так это ваша программа зависает? В какой строке?
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 48
18.11.2021, 19:01  [ТС] 10
Замабувараев, Не моя программа, а консольная, при отправке stderr в мою прогу на пьюрике.
И только если много данных отправляет.. Если мало, то всё ок
Если я закрою свою прогу, то и консольная отвисает.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,253
Записей в блоге: 4
18.11.2021, 19:11 11
А ваша программа получает весь StdError до конца?
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 48
18.11.2021, 20:31  [ТС] 12
Замабувараев, вывода инфы нет.... просто виснит консольная, а моя прога ждёт...
Вот я думаю, что может виной запущенный cmd из моей программы и нужно попробовать запускать консольную утилиту напрямую...

Добавлено через 11 минут
Убрал запуск через cmd, такая же проблема...
Если данных в stderr много, то программа на пьюрике не может их принять и тормозит консольное приложение...
Если закрыть консольное приложение, данные не поступают
Если закрыть программу на пьюрике, то консольное приложение отвисает и выполняет свои действия.
Посему у меня вывод: Чтение потока stderr ограничено каким то размером и если он больше, то пьюр программа не справляется...
0
49 / 47 / 3
Регистрация: 06.11.2010
Сообщений: 155
Записей в блоге: 1
18.11.2021, 20:44 13
На офсайте поищи тему "How to get stdout from Linux terminal?" или комбинацию поиск: ReadProgramData и ник: NicTheQuick. Там пример указания размера буфера, используется ReadProgramError.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,253
Записей в блоге: 4
18.11.2021, 20:48 14
Цитата Сообщение от CryptoNickSoft Посмотреть сообщение
Убрал запуск через cmd, такая же проблема...
Так вывод чьей программы вы читаете? cmd.exe или которой вам надо?
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 48
18.11.2021, 20:54  [ТС] 15
Вот такое выводится в stderr:
Кликните здесь для просмотра всего текста
[vendor_a/app_a] not found in canned fs_config, using defaults
[vendor_a/app_b] not found in canned fs_config, using defaults
[vendor_a/app_c] not found in canned fs_config, using defaults
[vendor_a/app_d] not found in canned fs_config, using defaults
[vendor_a/app_a/DLNA] not found in canned fs_config, using defaults
[vendor_a/app_a/FileBrowser] not found in canned fs_config, using defaults
[vendor_a/app_a/Miracast] not found in canned fs_config, using defaults
[vendor_a/app_a/VideoPlayer] not found in canned fs_config, using defaults
[vendor_a/app_a/DLNA/DLNA.apk] not found in canned fs_config, using defaults
[vendor_a/app_a/FileBrowser/FileBrowser.apk] not found in canned fs_config, using defaults
[vendor_a/app_a/FileBrowser/oat] not found in canned fs_config, using defaults
[vendor_a/app_a/FileBrowser/oat/arm] not found in canned fs_config, using defaults
[vendor_a/app_a/FileBrowser/oat/arm/FileBrowser.odex] not found in canned fs_config, using defaults
[vendor_a/app_a/FileBrowser/oat/arm/FileBrowser.vdex] not found in canned fs_config, using defaults
[vendor_a/app_a/Miracast/Miracast.apk] not found in canned fs_config, using defaults
[vendor_a/app_a/VideoPlayer/VideoPlayer.apk] not found in canned fs_config, using defaults
[vendor_a/app_a/VideoPlayer/lib] not found in canned fs_config, using defaults
[vendor_a/app_a/VideoPlayer/lib/arm] not found in canned fs_config, using defaults
[vendor_a/app_a/VideoPlayer/lib/arm/libsubtitlemanager_jni.so] not found in canned fs_config, using defaults
[vendor_a/app_b/DLNA] not found in canned fs_config, using defaults
[vendor_a/app_b/FileBrowser] not found in canned fs_config, using defaults
[vendor_a/app_b/Miracast] not found in canned fs_config, using defaults
[vendor_a/app_b/VideoPlayer] not found in canned fs_config, using defaults
[vendor_a/app_b/DLNA/DLNA.apk] not found in canned fs_config, using defaults
[vendor_a/app_b/FileBrowser/FileBrowser.apk] not found in canned fs_config, using defaults
[vendor_a/app_b/FileBrowser/oat] not found in canned fs_config, using defaults
[vendor_a/app_b/FileBrowser/oat/arm] not found in canned fs_config, using defaults
[vendor_a/app_b/FileBrowser/oat/arm/FileBrowser.odex] not found in canned fs_config, using defaults
[vendor_a/app_b/FileBrowser/oat/arm/FileBrowser.vdex] not found in canned fs_config, using defaults
[vendor_a/app_b/Miracast/Miracast.apk] not found in canned fs_config, using defaults
[vendor_a/app_b/VideoPlayer/VideoPlayer.apk] not found in canned fs_config, using defaults
[vendor_a/app_b/VideoPlayer/lib] not found in canned fs_config, using defaults
[vendor_a/app_b/VideoPlayer/lib/arm] not found in canned fs_config, using defaults
[vendor_a/app_b/VideoPlayer/lib/arm/libsubtitlemanager_jni.so] not found in canned fs_config, using defaults
[vendor_a/app_c/DLNA] not found in canned fs_config, using defaults
[vendor_a/app_c/FileBrowser] not found in canned fs_config, using defaults
[vendor_a/app_c/Miracast] not found in canned fs_config, using defaults
[vendor_a/app_c/VideoPlayer] not found in canned fs_config, using defaults
[vendor_a/app_c/DLNA/DLNA.apk] not found in canned fs_config, using defaults
[vendor_a/app_c/FileBrowser/FileBrowser.apk] not found in canned fs_config, using defaults
[vendor_a/app_c/FileBrowser/oat] not found in canned fs_config, using defaults
[vendor_a/app_c/FileBrowser/oat/arm] not found in canned fs_config, using defaults
[vendor_a/app_c/FileBrowser/oat/arm/FileBrowser.odex] not found in canned fs_config, using defaults
[vendor_a/app_c/FileBrowser/oat/arm/FileBrowser.vdex] not found in canned fs_config, using defaults
[vendor_a/app_c/Miracast/Miracast.apk] not found in canned fs_config, using defaults
[vendor_a/app_c/VideoPlayer/VideoPlayer.apk] not found in canned fs_config, using defaults
[vendor_a/app_c/VideoPlayer/lib] not found in canned fs_config, using defaults
[vendor_a/app_c/VideoPlayer/lib/arm] not found in canned fs_config, using defaults
[vendor_a/app_c/VideoPlayer/lib/arm/libsubtitlemanager_jni.so] not found in canned fs_config, using defaults
[vendor_a/app_d/DLNA] not found in canned fs_config, using defaults
[vendor_a/app_d/FileBrowser] not found in canned fs_config, using defaults
[vendor_a/app_d/Miracast] not found in canned fs_config, using defaults
[vendor_a/app_d/VideoPlayer] not found in canned fs_config, using defaults
[vendor_a/app_d/DLNA/DLNA.apk] not found in canned fs_config, using defaults
[vendor_a/app_d/FileBrowser/FileBrowser.apk] not found in canned fs_config, using defaults
[vendor_a/app_d/FileBrowser/oat] not found in canned fs_config, using defaults
[vendor_a/app_d/FileBrowser/oat/arm] not found in canned fs_config, using defaults
[vendor_a/app_d/FileBrowser/oat/arm/FileBrowser.odex] not found in canned fs_config, using defaults
[vendor_a/app_d/FileBrowser/oat/arm/FileBrowser.vdex] not found in canned fs_config, using defaults
[vendor_a/app_d/Miracast/Miracast.apk] not found in canned fs_config, using defaults
[vendor_a/app_d/VideoPlayer/VideoPlayer.apk] not found in canned fs_config, using defaults
[vendor_a/app_d/VideoPlayer/lib] not found in canned fs_config, using defaults
[vendor_a/app_d/VideoPlayer/lib/arm] not found in canned fs_config, using defaults
[vendor_a/app_d/VideoPlayer/lib/arm/libsubtitlemanager_jni.so] not found in canned fs_config, using defaults

И пьюрик не может обработать... Но я нашел обходное решение... Не читать данный поток, а скидывать его в текстовый файл. А уж после, загружать в окно моей программы.
0
49 / 47 / 3
Регистрация: 06.11.2010
Сообщений: 155
Записей в блоге: 1
18.11.2021, 20:58 16
из справки
Эта функция ожидает поступления от программы данных для чтения (то есть, блокирует читающую программу, пока не будут считаны данные
то есть в движок встроены временные интервалы, а у функии ошибок просто досит программу не давая ей работать
0
 Аватар для Pro_grammer
6807 / 2837 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
18.11.2021, 21:43 17
Цитата Сообщение от CryptoNickSoft Посмотреть сообщение
While ProgramRunning(iPid)
      Str$=ReadProgramStringOem(iPid)
      If Str$
        Str$ = stdOutString(FileName$, Str$)
        Message(Cn(Str$))
      EndIf
    Wend
Я так понимаю, пока программа запущена, то выполняется вот этот цикл и читаются StringOem.
И из цикла выход только в одном случае - когда программа завершит свою работу.
Таким образом управление передаётся в другой цикл, где и читаются ошибки ReadProgramError:
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
While #True
      stderr$ = ReadProgramError(iPid,  #PB_Ascii)
      If stderr$ ;Ascii
        
        If FileName$= "make_ext4fs" Or FileName$= "imgextractor";Ansii
          stderrOut$+stderr$+Chr(13)
        Else ;Oem
          iByteLength = Len(stderr$) + 2     
          sOem_in_Ascii$ = Space(iByteLength)
          PokeS(@sOem_in_Ascii$, stderr$, -1, #PB_Ascii)
          sunicode$ = Space(iByteLength)
          OemToChar_(@sOem_in_Ascii$, @sunicode$)
          stderrOut$+sunicode$+Chr(13)
        EndIf
        
        stderrOut$ = stdErrString(FileName$, stderrOut$)
        Message(Cn(stderrOut$))
      Else 
        Break
      EndIf
    Wend
Но программа уже не работает.
Откуда возьмутся ошибки? Мне не ясно.
Почему 2 разных цикла, а не как в моём примере, в одном?
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 48
18.11.2021, 21:59  [ТС] 18
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Почему 2 разных цикла, а не как в моём примере, в одном?
Потому как я в результате многочисленных тестов к этому пришел...
Кстати, сразу не присмотрелся к вашему коду, что там в одном цикле всё выполняется.
Реализовал у себя, зависоны пропали, результат получаю в режиме реального времени.
НО!!! Режет хвост... то есть читает буфер, всё выводит, но последние несколько строчек не отображает...
Миниатюры
RunProgram and #PB_Program_Error  
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 48
18.11.2021, 22:55  [ТС] 19
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Но программа уже не работает.
Откуда возьмутся ошибки? Мне не ясно.
Пишется в какой то буфер и они там накапливаются, пока их не считают.
Зависоны у меня были потому как в этом буфере собралось много данных, что пьюрик и считать уже не мог...
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Почему 2 разных цикла, а не как в моём примере, в одном?
Потому как в вашем варианте, не считываются все ошибки и некоторые не отображаются ибо в буфере может быть больше данных, чем можно считать за один раз, поэтому я его и считывал полностью после завершения работы программы в цикле... Ничего не терялось, но оказывается что размер буфера ограничен. Так и не понял как лучше сделать, что бы считать весь буфер stderr, без пропусков...
0
 Аватар для Pro_grammer
6807 / 2837 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
18.11.2021, 22:58 20
Цитата Сообщение от CryptoNickSoft Посмотреть сообщение
последние несколько строчек не отображает
Увеличить размер буфера?
0
18.11.2021, 22:58
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
Элементы алгоритмизации
hw_wired 28.01.2025
Основы алгоритмизации В современном мире алгоритмы играют фундаментальную роль в развитии информационных технологий и программирования. Понимание основ алгоритмизации является ключевым элементом в. . .
Человек и информация
hw_wired 28.01.2025
Введение: роль информации в познании мира В современном мире информация играет фундаментальную роль в процессе познания окружающей действительности. Она представляет собой совокупность сведений об. . .
Компьютер и информация
hw_wired 28.01.2025
Эволюция вычислительных машин История развития вычислительной техники начинается задолго до появления первых электронных устройств. Человечество всегда стремилось упростить процесс вычислений и. . .
Информационные технологии
hw_wired 28.01.2025
Введение в современные технологии работы с информацией В современном мире информационные технологии стали неотъемлемой частью практически всех сфер человеческой деятельности. Они существенно. . .
Информация вокруг нас
hw_wired 28.01.2025
Основные понятия информации В современном мире понятие информации является фундаментальным и охватывает практически все сферы человеческой деятельности. Информация представляет собой совокупность. . .
Компьютер для начинающих
hw_wired 28.01.2025
Введение в мир компьютерных технологий В современном мире информация стала одним из важнейших ресурсов человечества, определяющим развитие общества и технологий. Наша жизнь неразрывно связана с. . .
[golang] 189. Rotate Array
alhaos 28.01.2025
Повороты рукоятки, целочисленный слайс нужно сдвинуть на целое положительное число. Мне очень нравится решение на GO / / https:/ / leetcode. com/ studyplan/ top-interview-150/ package topInterview . . .
КуМир: решение задач на матрицы
bytestream 28.01.2025
КуМир представляет собой среду для обучения программированию, которая включает в себя мощные инструменты для работы с матрицами. Матрица в программировании - это двумерный массив, состоящий из. . .
КуМир: решение задач на строки
bytestream 28.01.2025
В системе программирования КуМир работа со строковыми данными является одним из важнейших аспектов создания программ. Строки представляют собой последовательности символов, заключенные в кавычки,. . .
КуМир: решение геометрических задач
bytestream 28.01.2025
Программирование геометрических задач в среде КуМир становится всё более актуальным в обучении школьников и студентов. КуМир — это разработанная в России обучающая программная среда, предназначенная. . .
КуМир, исполнитель Водолей: Задачи и решения
bytestream 28.01.2025
КуМир — это образовательная среда для обучения программированию. Она предлагает пользователям разнообразные инструменты для разработки и отладки программ, что особенно ценно для студентов и. . .
КуМир, исполнитель Чертежник: Решение задач
bytestream 28.01.2025
КуМир (Комплект Учебных МИРов) представляет собой образовательную среду для обучения основам программирования и алгоритмизации. Исполнитель Чертежник работает на координатной плоскости, где может. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru