powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / После выполнения CreateProcess зависаем на WaitForSingleObject
20 сообщений из 45, страница 2 из 2
После выполнения CreateProcess зависаем на WaitForSingleObject
    #40020279
segor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Повторюсь, что сей зависон возникает не со всеми консольными приложениями, но как-то связан с их выводом.

Друзья, кто может удаленно помочь - напишите, пжалста, в телегу @khudiakov_s
Моя благодарность не будет иметь границ)) Сил уже нет...
...
Рейтинг: 0 / 0
После выполнения CreateProcess зависаем на WaitForSingleObject
    #40020287
segor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кроик Семён
segor,
попробуйте этот код


Извиняюсь, выше неверно указал кусок кода.
Тут зависает:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
               repeat
                  BytesRead := 0;
                  ReadFile(readableEndOfPipe, Buffer[0], READ_BUFFER_SIZE, {var}BytesRead, nil);
                  Buffer[BytesRead]:= #0;
                  OemToAnsi(Buffer,Buffer);
                  AOutput.Text := AOutput.Text + String(Buffer);
               until (BytesRead < READ_BUFFER_SIZE);
...
Рейтинг: 0 / 0
После выполнения CreateProcess зависаем на WaitForSingleObject
    #40020290
segor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman
segor
пропущено...


Попробовал.
Зависает тут:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
      repeat
        ReadFile(ReadPipe, Buffer, ReadBuffer, BytesRead, nil);
        Buffer[BytesRead] := #0;
        result := result + Buffer;
 
 
      until (BytesRead < ReadBuffer);


Жесть... А если прочитается ровно столько сколько в буфере максимум? Что будет с последним байтом?


Там будет последний прочитанный байт. Разве нет?
...
Рейтинг: 0 / 0
После выполнения CreateProcess зависаем на WaitForSingleObject
    #40020291
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
segor
wadman
пропущено...

Жесть... А если прочитается ровно столько сколько в буфере максимум? Что будет с последним байтом?


Там будет последний прочитанный байт. Разве нет?


Кроик Семён
Код: pascal
1.
Buffer := AllocMem(READ_BUFFER_SIZE+1);


Отставить панику. Это моя невнимательность. Всё нормально. :)
...
Рейтинг: 0 / 0
После выполнения CreateProcess зависаем на WaitForSingleObject
    #40020292
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
segor
Извиняюсь, выше неверно указал кусок кода.
Тут зависает:

Там чуть выше есть комментарий:
Кроик Семён
Код: pascal
1.
//WARNING: if the console app never writes anything to the StdOutput, then ReadFile will block and never return

...
Рейтинг: 0 / 0
После выполнения CreateProcess зависаем на WaitForSingleObject
    #40020295
segor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman
segor
Извиняюсь, выше неверно указал кусок кода.
Тут зависает:

Там чуть выше есть комментарий:
Кроик Семён
Код: pascal
1.
//WARNING: if the console app never writes anything to the StdOutput, then ReadFile will block and never return



Но подвисает как раз когда есть вывод(
...
Рейтинг: 0 / 0
После выполнения CreateProcess зависаем на WaitForSingleObject
    #40020299
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
segor
Друзья, кто может удаленно помочь - напишите, пжалста, в телегу @khudiakov_s
Моя благодарность не будет иметь границ)) Сил уже нет...


Ты готовое решение пробовал? https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1330938&msg=22233231
...
Рейтинг: 0 / 0
После выполнения CreateProcess зависаем на WaitForSingleObject
    #40020300
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
segor,

посмотри здесь, не зависает, передает данные на вход, вычитывает все что передано обратно...

Перенаправление вывода в файл
...
Рейтинг: 0 / 0
После выполнения CreateProcess зависаем на WaitForSingleObject
    #40020301
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня как-то так сделано, ничего не подвисает:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
  procedure ProcessFlow(hProcess, hReadPipe: THandle);
  const
    BUFFER_SIZE = 1024;
  var
    BytesAvail: Cardinal;
    BytesRead: Cardinal;
    Buffer: array [0..BUFFER_SIZE - 1] of AnsiChar;
    dwWait: Cardinal;
  begin
    repeat
      dwWait := WaitForSingleObject(hProcess, 100);
      WinAPICheck(PeekNamedPipe(hReadPipe, nil, 0, nil, @BytesAvail, nil), 'PeekNamedPipe');
      while BytesAvail > 0 do
      begin
        WinAPICheck(
          ReadFile(hReadPipe, @Buffer[0], Min(BytesAvail, BUFFER_SIZE), @BytesRead, nil), 'ReadFile');
        if BytesRead = 0 then Break; // что-то пошло не так
        Dec(BytesAvail, BytesRead);
//        OemToCharBuffA(@Buffer[0], @Buffer[0], BytesRead);
        Обрабатываем Buffer
      end;
    until dwWait <> WAIT_TIMEOUT;
  end;


P.S: Повырезал всё лишнее.
...
Рейтинг: 0 / 0
После выполнения CreateProcess зависаем на WaitForSingleObject
    #40020303
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
Всё нормально
Ну я б не сказал.
Если ReadFile начнет возвращать False, или размер прочитанного окажется меньше ожидаемого - будет вечный цикл.
Каша-алгоритм это, а не всё нормально. Надежда только на везение.
...
Рейтинг: 0 / 0
После выполнения CreateProcess зависаем на WaitForSingleObject
    #40020305
segor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev Alexey
segor
Друзья, кто может удаленно помочь - напишите, пжалста, в телегу @khudiakov_s
Моя благодарность не будет иметь границ)) Сил уже нет...


Ты готовое решение пробовал? https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1330938&msg=22233231


Я его не осилил( Не хватает знаниев. Не компилируется.
...
Рейтинг: 0 / 0
После выполнения CreateProcess зависаем на WaitForSingleObject
    #40020325
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
segor,

Какая у тебя версия Delphi?
...
Рейтинг: 0 / 0
После выполнения CreateProcess зависаем на WaitForSingleObject
    #40020346
segor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev Alexey
segor,

Какая у тебя версия Delphi?


10.3
...
Рейтинг: 0 / 0
После выполнения CreateProcess зависаем на WaitForSingleObject
    #40020355
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
segorЯ его не осилил( Не хватает знаниев. Не компилируется.

Ну так прокачивай знания пока не осилишь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
После выполнения CreateProcess зависаем на WaitForSingleObject
    #40020357
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.
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Windows;

//
Function ExecuteProcess(Const AExecutable, ACommandLine, ACurrentDir : String; ACodePage : Word = CP_OEMCP) : String;
Const

 CP_UTF16_LE = 1200;

Var

 RPipe     : THandle;
 WPipe     : THandle;
 SA        : TSecurityAttributes;
 SI        : TStartupInfo;
 PA        : TProcessInformation;
 Buffer    : Array [0 .. 128 - 1] Of Byte;
 Count     : Cardinal;
 AccBuffer : RawByteString;

Begin

 Result := '';

 //
 ZeroMemory(@SA, SizeOf(SA));

 SA.nLength              := SizeOf(SA);
 SA.lpSecurityDescriptor := NIL;
 SA.bInheritHandle       := True;
 //

 If Not CreatePipe(RPipe, WPipe, @SA, 0) Then
  RaiseLastOSError;

 Try

  //
  ZeroMemory(@SI, SizeOf(SI));

  SI.cb          := SizeOf(SI);
  SI.hStdOutput  := WPipe;
  SI.hStdError   := WPipe;
  SI.dwFlags     := STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW;
  SI.wShowWindow := SW_HIDE;
  //

  //
  ZeroMemory(@PA, SizeOf(PA));
  //

  If CreateProcess(PChar(AExecutable), PChar(ACommandLine), NIL, NIL, True, 0, NIL, PChar(Pointer(ACurrentDir)), SI, PA) Then
   Try

    If WPipe <> INVALID_HANDLE_VALUE Then
     Begin

      CloseHandle(WPipe);

      WPipe := INVALID_HANDLE_VALUE;

     End;

    While ReadFile(RPipe, Buffer, SizeOf(Buffer), Count, NIL) And (Count > 0) Do
     Begin

      SetLength(AccBuffer, Length(AccBuffer) + Integer(Count));
      Move(Buffer, AccBuffer[Length(AccBuffer) - Integer(Count) + 1], Count);

     End;

    If ACodePage = CP_UTF16_LE Then
     Begin

      SetLength(Result, Length(AccBuffer) Div SizeOf(WideChar));
      Move(Pointer(AccBuffer)^, Pointer(Result)^, Length(Result) * SizeOf(WideChar));

     End
    Else
     Begin

      SetCodePage(AccBuffer, ACodePage, False);

      Result := String(AccBuffer);

     End;

   Finally

    WaitForSingleObject(PA.hProcess, INFINITE);

    CloseHandle(PA.hThread);
    CloseHandle(PA.hProcess);

   End
  Else
   RaiseLastOSError;

 Finally

  If RPipe <> INVALID_HANDLE_VALUE Then
   CloseHandle(RPipe);

  If WPipe <> INVALID_HANDLE_VALUE Then
   CloseHandle(WPipe);

 End;

End;
//

var
 s : string;
begin

 WriteLn(ExecuteProcess('C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\dcc32.exe', '', ''));

 s := ExecuteProcess('c:\windows\system32\cmd.exe', '/U /C dir', 'c:\', 1200);
 MessageBox(0, PChar(s), 'cmd', MB_ICONINFORMATION or MB_OK);

end.

...
Рейтинг: 0 / 0
После выполнения CreateProcess зависаем на WaitForSingleObject
    #40020533
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да возьмите у джедаев и все
...
Рейтинг: 0 / 0
После выполнения CreateProcess зависаем на WaitForSingleObject
    #40020567
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возьмите готовое и многократно опробованное решение в жедаях. так вам нравится ковыряться в велосипедах, которые уже лет 20 как отлично решены
...
Рейтинг: 0 / 0
После выполнения CreateProcess зависаем на WaitForSingleObject
    #40020578
segor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Покурим с джедаями)
...
Рейтинг: 0 / 0
После выполнения CreateProcess зависаем на WaitForSingleObject
    #40020579
segor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Windows;

//
Function ExecuteProcess(Const AExecutable, ACommandLine, ACurrentDir : String; ACodePage : Word = CP_OEMCP) : String;
Const

 CP_UTF16_LE = 1200;

Var

 RPipe     : THandle;
 WPipe     : THandle;
 SA        : TSecurityAttributes;
 SI        : TStartupInfo;
 PA        : TProcessInformation;
 Buffer    : Array [0 .. 128 - 1] Of Byte;
 Count     : Cardinal;
 AccBuffer : RawByteString;

Begin

 Result := '';

 //
 ZeroMemory(@SA, SizeOf(SA));

 SA.nLength              := SizeOf(SA);
 SA.lpSecurityDescriptor := NIL;
 SA.bInheritHandle       := True;
 //

 If Not CreatePipe(RPipe, WPipe, @SA, 0) Then
  RaiseLastOSError;

 Try

  //
  ZeroMemory(@SI, SizeOf(SI));

  SI.cb          := SizeOf(SI);
  SI.hStdOutput  := WPipe;
  SI.hStdError   := WPipe;
  SI.dwFlags     := STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW;
  SI.wShowWindow := SW_HIDE;
  //

  //
  ZeroMemory(@PA, SizeOf(PA));
  //

  If CreateProcess(PChar(AExecutable), PChar(ACommandLine), NIL, NIL, True, 0, NIL, PChar(Pointer(ACurrentDir)), SI, PA) Then
   Try

    If WPipe <> INVALID_HANDLE_VALUE Then
     Begin

      CloseHandle(WPipe);

      WPipe := INVALID_HANDLE_VALUE;

     End;

    While ReadFile(RPipe, Buffer, SizeOf(Buffer), Count, NIL) And (Count > 0) Do
     Begin

      SetLength(AccBuffer, Length(AccBuffer) + Integer(Count));
      Move(Buffer, AccBuffer[Length(AccBuffer) - Integer(Count) + 1], Count);

     End;

    If ACodePage = CP_UTF16_LE Then
     Begin

      SetLength(Result, Length(AccBuffer) Div SizeOf(WideChar));
      Move(Pointer(AccBuffer)^, Pointer(Result)^, Length(Result) * SizeOf(WideChar));

     End
    Else
     Begin

      SetCodePage(AccBuffer, ACodePage, False);

      Result := String(AccBuffer);

     End;

   Finally

    WaitForSingleObject(PA.hProcess, INFINITE);

    CloseHandle(PA.hThread);
    CloseHandle(PA.hProcess);

   End
  Else
   RaiseLastOSError;

 Finally

  If RPipe <> INVALID_HANDLE_VALUE Then
   CloseHandle(RPipe);

  If WPipe <> INVALID_HANDLE_VALUE Then
   CloseHandle(WPipe);

 End;

End;
//

var
 s : string;
begin

 WriteLn(ExecuteProcess('C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\dcc32.exe', '', ''));

 s := ExecuteProcess('c:\windows\system32\cmd.exe', '/U /C dir', 'c:\', 1200);
 MessageBox(0, PChar(s), 'cmd', MB_ICONINFORMATION or MB_OK);

end.



Спасибо )
...
Рейтинг: 0 / 0
После выполнения CreateProcess зависаем на WaitForSingleObject
    #40020700
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
segor
Спасибо. Покурим с джедаями)

Что бы долго не искать:
https://github.com/project-jedi/jcl/blob/9d89903a2ee38fa72be47df433c46c7747ba4025/jcl/source/common/JclSysUtils.pas#L501
...
Рейтинг: 0 / 0
20 сообщений из 45, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / После выполнения CreateProcess зависаем на WaitForSingleObject
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]