|
|
|
После выполнения 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 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=40019053&tid=2037841]: |
0ms |
get settings: |
8ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
290ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 566ms |

| 0 / 0 |
