|
|
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Всем привет! Подскажите, пожалуйста: Необходимо выполнять консольное приложение и получить его вывод. Нашел такой код: Код: pascal 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. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. Но, к сожалению, он не со всеми приложениями работает корректно. Выполнение некоторых консольных приложений привод к зависанию вот в этом месте: Код: pascal 1. (в диспетчере задач видим незавершенный процесс запущенного консольного приложения) Если это же консольное приложение выполнять из командной строки - то все выполняется корректно (выводит результаты в консоль и завершается). Что в коде не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2020, 17:32 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
segor Выполнение некоторых консольных приложений привод к зависанию вот в этом месте Перенеси эту строчку после цикла чтения из пайпа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2020, 17:49 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
segorЧто в коде не так? В коде много чего неправильно. Изучай оригинал: https://docs.microsoft.com/en-us/windows/win32/ProcThread/creating-a-child-process-with-redirected-input-and-output Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2020, 17:57 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey segor Выполнение некоторых консольных приложений привод к зависанию вот в этом месте Перенеси эту строчку после цикла чтения из пайпа. Перенес. Все равно на ней виснет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2020, 17:58 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey Перенеси эту строчку после цикла чтения из пайпа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2020, 18:20 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
segor Если это же консольное приложение выполнять из командной строки - то все выполняется корректно (выводит результаты в консоль и завершается). Сделайте Код: pascal 1. и посмотрите, что ждет приложение Далее, поверьте, вот это segor Код: pascal 1. А вот эти две строки segor Код: pascal 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2020, 18:29 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Сейчас все логично: ждем пока процесс не завершится, а потом выгребаем все из пайпа. Ага, но перед этим сделали с вызываемым процессом грязный трюк, описанный в одном бородатом анекдоте фразой "а теперь циркулируй". Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2020, 18:39 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
segor Перенес. Все равно на ней виснет. У тебя ещё условие цикла некорректное. Чтение может вернуть меньше, чем ты просишь, но это не повод прерывать цикл. _Vasilisk_ Сейчас все логично: ждем пока процесс не завершится, а потом выгребаем все из пайпа. А буфер пайпа у тебя бесконечный? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2020, 18:43 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ segor Если это же консольное приложение выполнять из командной строки - то все выполняется корректно (выводит результаты в консоль и завершается). Сделайте Код: pascal 1. и посмотрите, что ждет приложение Далее, поверьте, вот это segor Код: pascal 1. А вот эти две строки segor Код: pascal 1. 2. 3. 4. Сделал. Появляется консольное окно. В нем мигает курсор. Вывода нет. Тут все так же виснем WaitForSingleObject ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2020, 18:50 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
ExecuteProcess Код: pascal 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. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2020, 18:52 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
segor Если это же консольное приложение выполнять из командной строки - то все выполняется корректно (выводит результаты в консоль и завершается). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2020, 18:52 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov segorЧто в коде не так? В коде много чего неправильно. Изучай оригинал: https://docs.microsoft.com/en-us/windows/win32/ProcThread/creating-a-child-process-with-redirected-input-and-output Ок, спасибо, будем изучать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2020, 18:53 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
bk0010 segor Если это же консольное приложение выполнять из командной строки - то все выполняется корректно (выводит результаты в консоль и завершается). Да точно. В диспетчере задач появляется после запуска и пропадает после завершения работы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2020, 18:54 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
segor Появляется консольное окно. В нем мигает курсор. Вывода нет. Делайте так segor Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2020, 19:11 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Логично, вы же весь вывод затягиваете к себе в программу. Нет. Присмотрись повнимательнее куда он засунул второй конец трубы. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2020, 19:15 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov Присмотрись повнимательнее куда он засунул второй конец трубы. _Vasilisk_ Далее, поверьте, вот это segor Код: pascal 1. Ну и если программа не ожидает ввода, то это ни на что влиять не должно. А если ожидает, то код должен быть совершенно другим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2020, 19:24 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ segor Появляется консольное окно. В нем мигает курсор. Вывода нет. Делайте так segor Код: pascal 1. Сделал. Теперь вижу в консольном окне вывод приложения так, как было бы если запускал его из командой строки. function Run_Dosfunction Run_Dos(CmdLine: string) : string; const ReadBuffer = 255; var Security: TSecurityAttributes; ReadPipe, WritePipe: THandle; start: TStartUpInfo; ProcessInfo: TProcessInformation; Buffer: array [0 .. 255] of Char; BytesRead: DWord; Apprunning: DWord; begin with Security do begin nlength := SizeOf(TSecurityAttributes); binherithandle := true; lpsecuritydescriptor := nil; end; if Createpipe(ReadPipe, WritePipe, @Security, 0) then begin result := ''; FillChar(Start, Sizeof(Start), #0); start.cb := SizeOf(start); start.hStdOutput := WritePipe; // start.hStdInput := ReadPipe; // start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW; start.dwFlags := STARTF_USESHOWWINDOW; // start.wShowWindow := SW_HIDE; start.wShowWindow := SW_SHOW; if CreateProcess(nil, PChar(CmdLine), @Security, @Security, true, NORMAL_PRIORITY_CLASS, nil, nil, start, ProcessInfo) then begin //перед чтением из пайпа закрыть один конец CloseHandle(WritePipe); Apprunning := WaitForSingleObject(ProcessInfo.hProcess, infinite); repeat ReadFile(ReadPipe, Buffer, ReadBuffer, BytesRead, nil); Buffer[BytesRead] := #0; result := result + Buffer; until (BytesRead < ReadBuffer); end; CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); CloseHandle(ReadPipe); end; end; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2020, 19:25 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
segor Теперь вижу в консольном окне вывод приложения так, как было бы если запускал его из командой строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2020, 19:27 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ segor Теперь вижу в консольном окне вывод приложения так, как было бы если запускал его из командой строки. Само. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2020, 19:28 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
segor Само. Код: pascal 1. то запущенное приложение завершается само и ваша программа не зависает? При этом в запущенном приложении вы не нажимаете никаких клавиш? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2020, 15:19 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ segor Само. Код: pascal 1. то запущенное приложение завершается само и ваша программа не зависает? При этом в запущенном приложении вы не нажимаете никаких клавиш? Да, так и есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2020, 10:46 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
segor, попробуйте этот код Код: pascal 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. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2020, 11:16 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2020, 13:04 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Кроик Семён segor, попробуйте этот код Попробовал. Зависает тут: Код: pascal 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2020, 10:33 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
segor Кроик Семён segor, попробуйте этот код Попробовал. Зависает тут: Код: pascal 1. 2. 3. 4. 5. 6. 7. Жесть... А если прочитается ровно столько сколько в буфере максимум? Что будет с последним байтом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2020, 10:57 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Повторюсь, что сей зависон возникает не со всеми консольными приложениями, но как-то связан с их выводом. Друзья, кто может удаленно помочь - напишите, пжалста, в телегу @khudiakov_s Моя благодарность не будет иметь границ)) Сил уже нет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2020, 11:24 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Кроик Семён segor, попробуйте этот код Извиняюсь, выше неверно указал кусок кода. Тут зависает: Код: pascal 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2020, 11:27 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
wadman segor пропущено... Попробовал. Зависает тут: Код: pascal 1. 2. 3. 4. 5. 6. 7. Жесть... А если прочитается ровно столько сколько в буфере максимум? Что будет с последним байтом? Там будет последний прочитанный байт. Разве нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2020, 11:29 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
segor wadman пропущено... Жесть... А если прочитается ровно столько сколько в буфере максимум? Что будет с последним байтом? Там будет последний прочитанный байт. Разве нет? Кроик Семён Код: pascal 1. Отставить панику. Это моя невнимательность. Всё нормально. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2020, 11:31 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
segor Извиняюсь, выше неверно указал кусок кода. Тут зависает: Там чуть выше есть комментарий: Кроик Семён Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2020, 11:33 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
wadman segor Извиняюсь, выше неверно указал кусок кода. Тут зависает: Там чуть выше есть комментарий: Кроик Семён Код: pascal 1. Но подвисает как раз когда есть вывод( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2020, 11:39 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
segor Друзья, кто может удаленно помочь - напишите, пжалста, в телегу @khudiakov_s Моя благодарность не будет иметь границ)) Сил уже нет... Ты готовое решение пробовал? https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1330938&msg=22233231 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2020, 11:45 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
segor, посмотри здесь, не зависает, передает данные на вход, вычитывает все что передано обратно... Перенаправление вывода в файл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2020, 11:45 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
У меня как-то так сделано, ничего не подвисает: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. P.S: Повырезал всё лишнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2020, 11:50 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
wadman Всё нормально Если ReadFile начнет возвращать False, или размер прочитанного окажется меньше ожидаемого - будет вечный цикл. Каша-алгоритм это, а не всё нормально. Надежда только на везение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2020, 12:00 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey segor Друзья, кто может удаленно помочь - напишите, пжалста, в телегу @khudiakov_s Моя благодарность не будет иметь границ)) Сил уже нет... Ты готовое решение пробовал? https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1330938&msg=22233231 Я его не осилил( Не хватает знаниев. Не компилируется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2020, 12:07 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
segor, Какая у тебя версия Delphi? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2020, 12:49 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey segor, Какая у тебя версия Delphi? 10.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2020, 13:25 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
segorЯ его не осилил( Не хватает знаниев. Не компилируется. Ну так прокачивай знания пока не осилишь. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2020, 13:38 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
segor, Упрощённый ExecuteProcess Код: pascal 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. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2020, 13:39 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Да возьмите у джедаев и все ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2020, 18:09 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
возьмите готовое и многократно опробованное решение в жедаях. так вам нравится ковыряться в велосипедах, которые уже лет 20 как отлично решены ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2020, 18:58 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Спасибо. Покурим с джедаями) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2020, 19:34 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey segor, Упрощённый ExecuteProcess Код: pascal 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. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. Спасибо ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2020, 19:36 |
|
||
|
После выполнения CreateProcess зависаем на WaitForSingleObject
|
|||
|---|---|---|---|
|
#18+
segor Спасибо. Покурим с джедаями) Что бы долго не искать: https://github.com/project-jedi/jcl/blob/9d89903a2ee38fa72be47df433c46c7747ba4025/jcl/source/common/JclSysUtils.pas#L501 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2020, 10:48 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2037841]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
386ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 193ms |
| total: | 681ms |

| 0 / 0 |
