С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 16.05.2020
Сообщений: 25

После выполнения CreateProcess зависаем на WaitForSingleObject

16.11.2020, 17:14. Показов 1888. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Подскажите, пожалуйста:

Необходимо выполнять консольное приложение и получать его вывод.
Нашел такой код:
Delphi
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
function Run_Dos(CmdLine: string) : string;
const
  ReadBuffer = 255;
var
  Security: TSecurityAttributes;
  ReadPipe, WritePipe: THandle;
  start: TStartUpInfo;
  ProcessInfo: TProcessInformation;
  Buffer: array [0 .. 255] of AnsiChar;
  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.wShowWindow := SW_HIDE;
 
 
    if CreateProcess(nil,
      PChar(CmdLine),
      @Security,
      @Security,
      true,
      NORMAL_PRIORITY_CLASS,
      nil,
      nil,
      start,
      ProcessInfo) then
    begin
 
//     Apprunning := WaitForSingleObject(ProcessInfo.hProcess, 10000);
     Apprunning := WaitForSingleObject(ProcessInfo.hProcess, infinite);
 
 
    //перед чтением из пайпа закрыть один конец
     CloseHandle(WritePipe);
 
      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;
Но, к сожалению, он не со всеми приложениями работает корректно. Выполнение некоторых консольных приложений привод к зависанию вот в этом месте:
Delphi
1
     Apprunning := WaitForSingleObject(ProcessInfo.hProcess, infinite);
Если это же консольное приложение выполнять из командной строки - то все выполняется корректно (выводит результаты в консоль и завершается).

Что в коде не так?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.11.2020, 17:14
Ответы с готовыми решениями:

Зависаем-с конкретно...
Народ, объясните, пожалуйста, причину зависания. Как только нажимаю на диалог - виснет, зараза, и с концами. ОТдельно диалог работает...

Результат выполнения программы в консоли пропадает после выполнения скрипта
нужно отпарсить файл , но мне надо видеть что выводит сценарий , иначе мне его неотладить. Запускаю файл вот так python index.py

Каково будет значение переменной k после выполнения следующего оператора k = k++; если до его выполнения k равнялось 6?
варианты ответов a) 8 b) 6 c) 7 d) 9 помогите зарание спасибо

7
38 / 13 / 3
Регистрация: 30.09.2020
Сообщений: 65
16.11.2020, 18:05
https://docs.microsoft.com/ru-... dfrom=MSDN


The time-out interval, in milliseconds. If a nonzero value is specified, the function waits until the object is signaled or the interval elapses. If dwMilliseconds is zero, the function does not enter a wait state if the object is not signaled; it always returns immediately. If dwMilliseconds is INFINITE, the function will return only when the object is signaled.



Цитата Сообщение от khuidakov_s Посмотреть сообщение
Delphi
1
(, infinite);


И почему же ?
0
Злостный нарушитель
 Аватар для Verevkin
10249 / 5676 / 1262
Регистрация: 12.03.2015
Сообщений: 26,307
16.11.2020, 18:13
У меня тут есть для консольных приложений такая функция.
Delphi
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
// черновик кандидата в аналоги сишной функции system()
function system(const command: string): DWORD;
{$IFDEF MSWINDOWS}
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  ZeroMemory(@StartupInfo, SizeOf(StartupInfo));
  StartupInfo.cb:= SizeOf(StartupInfo);
 
  var cmd_exe:= GetEnvironmentVariable('SystemRoot') + '\system32\cmd.exe';
 
  if CreateProcess(PChar(cmd_exe),                        // имя исполняемого модуля
                   PChar('/c ' + command),                // строка параметров запускаемой программы
                   nil,                                   // структура SECURITY_ATTRIBUTES процесса
                   nil,                                   // структура SECURITY_ATTRIBUTES потока
                   true,                                  // флаг наследования текущего процесса
                   NORMAL_PRIORITY_CLASS,                 // флаги способов создания процесса
                   nil,                                   // указатель на блок среды
                   nil,                                   // текущий диск и каталог
                   StartupInfo,                           // структура STARTUPINFO
                   ProcessInfo)                           // структура PROCESS_INFORMATION
    then begin
           CloseHandle(ProcessInfo.hThread);
           WaitForSingleObject(ProcessInfo.hProcess, INFINITE); // ожидание выхода
           CloseHandle(ProcessInfo.hProcess);
           result:= 0;
         end
    else result:= GetLastError();
end;
{$ELSE}
begin
{$MESSAGE FATAL 'Для других компиляторов реализации пока нету.'}
end;
{$ENDIF}
В GUI я не тестировал и пайпы не создавал, она для других целей - исполнять консольные команды и запускать консольные приложения в той же консоли, что и мой процесс. Посмотри, мож какие мысли появятся...
0
0 / 0 / 0
Регистрация: 16.05.2020
Сообщений: 25
16.11.2020, 19:11  [ТС]
Цитата Сообщение от Ligren Посмотреть сообщение
И почему же ?
а почему нет? хочу в любом случае дождаться окончания выполнения приложения.

Добавлено через 4 минуты
Цитата Сообщение от Verevkin Посмотреть сообщение
У меня тут есть для консольных приложений такая функция.
Видел подобно. Но тут приложение запускается из командной строки (cmd /c) и с этим возникают трудности если в параметрах запускаемого приложение есть двойные кавычки. И здесь нет перехвата вывода консоли.
0
Злостный нарушитель
 Аватар для Verevkin
10249 / 5676 / 1262
Регистрация: 12.03.2015
Сообщений: 26,307
16.11.2020, 19:36
Цитата Сообщение от khuidakov_s Посмотреть сообщение
Но тут приложение запускается из командной строки (cmd /c) и с этим возникают трудности если в параметрах запускаемого приложение есть двойные кавычки. И здесь нет перехвата вывода консоли.
ну так переделай!
кто ж тебе мешает-то?....
0
0 / 0 / 0
Регистрация: 16.05.2020
Сообщений: 25
16.11.2020, 20:02  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
ну так переделай!
кто ж тебе мешает-то?....
Дык соссна получим то что в первом посте)
0
Злостный нарушитель
 Аватар для Verevkin
10249 / 5676 / 1262
Регистрация: 12.03.2015
Сообщений: 26,307
16.11.2020, 20:30
Цитата Сообщение от khuidakov_s Посмотреть сообщение
Дык соссна получим то что в первом посте)
0
38 / 13 / 3
Регистрация: 30.09.2020
Сообщений: 65
16.11.2020, 20:39
Дык пусть использует Execute из Jcl Он и под линуху работает.

https://github.com/project-jed... .pas#L3302
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.11.2020, 20:39
Помогаю со студенческими работами здесь

WaitForSingleObject
Приветствую. Вот собственно код который нужно поправить. void changeFile() { DWORD dwWaitStatus; HANDLE dwChangeHandles; ...

WaitForSingleObject - вопрос.
Привет. WinApi функция WaitForSingleObject. Как она работает? Ждет завершения патока (тот, что первий параметр), зачем тогда задержка...

Потоки. WaitForSingleObject.
Здравствуйте! Помогите пожалуйста решить проблему. Читать лучше сразу самый низ кода - большой комент, там в принципе вся проблема и...

SetEvent + WaitForSingleObject
Есть ли гарантия, что WaitForSingleObject успеет сработать, если другой поток сделает SetEvent и CloseHandle подряд? Добавлено через...

WaitForSingleObject - проблема!
здравствуйте, у меня есть шаблонный список елементов структуры struct proc { int exename; int outfile; int size_time; ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru