Size: a a a

2020 December 10

DB

Dmitry Belkevich in Delphi & Lazarus
Yerlan Assanov
а когда начнут 100 сессий обращаться одному процессу?
почему процесс будет один? каждый раз запускается новый 7z/7za
источник

YA

Yerlan Assanov in Delphi & Lazarus
Andrey Zubov
я не могу контролировать что там делается и как, для меня этот exe и dll это есть черный ящик
вот поэтому хотелось бы заюзат ьвсе в одном процессе
источник

AZ

Andrey Zubov in Delphi & Lazarus
источник

AZ

Andrey Zubov in Delphi & Lazarus
там и про createprocess есть немного
источник

DB

Dmitry Belkevich in Delphi & Lazarus
ну у него не шеллэкзекьют как раз ) так что нормально
источник

YA

Yerlan Assanov in Delphi & Lazarus
у нас if not CreateProcess(PChar(Path + '7za.exe'), PChar(CmdLine), nil, nil, TRUE, 0,
       nil, PChar(Path), &si, &pi) then
       Exit;
источник

AZ

Andrey Zubov in Delphi & Lazarus
про CreateProcess там есть ссылки
источник

AZ

Andrey Zubov in Delphi & Lazarus
источник

DB

Dmitry Belkevich in Delphi & Lazarus
в жедаях самый надежный запускатор процессов, что я видел, мы его и юзаем. CreateProcess юзается
источник

AZ

Andrey Zubov in Delphi & Lazarus
вы еще JVCL вспомните :)
источник

DB

Dmitry Belkevich in Delphi & Lazarus
WinExec32AndWait в JclMiscel
источник

DB

Dmitry Belkevich in Delphi & Lazarus
кода мало. скопирую сюда

function WinExec32AndWait(Cmd: string; const CmdShow: Integer): Cardinal;
var
 StartupInfo: TStartupInfo;
 ProcessInfo: TProcessInformation;
begin
 Result := Cardinal($FFFFFFFF);
 ResetMemory(StartupInfo, SizeOf(TStartupInfo));
 ResetMemory(ProcessInfo, SizeOf(ProcessInfo));
 StartupInfo.cb := SizeOf(TStartupInfo);
 StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
 StartupInfo.wShowWindow := CmdShow;
 UniqueString(Cmd);//in the Unicode version the parameter lpCommandLine needs to be writable
 if CreateProcess(nil, PChar(Cmd), nil, nil, False, NORMAL_PRIORITY_CLASS,
   nil, nil, StartupInfo, ProcessInfo) then
 begin
   WaitForInputIdle(ProcessInfo.hProcess, INFINITE);
   if WaitForSingleObject(ProcessInfo.hProcess, INFINITE) = WAIT_OBJECT_0 then
   begin
     if not GetExitCodeProcess(ProcessInfo.hProcess, Result) then
       Result := Cardinal($FFFFFFFF);
   end;
   CloseHandle(ProcessInfo.hThread);
   CloseHandle(ProcessInfo.hProcess);
 end;
end;
источник

DB

Dmitry Belkevich in Delphi & Lazarus
Oleg Timkiv
if not CreateProcess(PChar(Path + '7za.exe'), PChar(CmdLine), nil, nil, TRUE, 0,
       nil, PChar(Path), &si, &pi) then
       Exit;

   SetProcessPriority(pi.hProcess, PROCESS_PRIORITY_ABOVE_NORMAL);

   WaitForSingleObject(pi.hProcess, INFINITE);

   if not GetExitCodeProcess(pi.hProcess, dwExitCode) then
       Exit;
у тебя тут, к слову, хэндлы будут течь
источник

YA

Yerlan Assanov in Delphi & Lazarus
источник

VA

Viktor Akselrod in Delphi & Lazarus
   FileName := TempDir + '\stream.data';
   ArchiveFileName := TempDir + '\stream.7z';

для начала сделайте уникальные имена временным файлам
если у вас работают несколько процессов с одним файлом - это явно будет приводить к конфликтам
источник

YA

Yerlan Assanov in Delphi & Lazarus
Вы про stream.7z?
источник

YA

Yerlan Assanov in Delphi & Lazarus
в принципе можно уид сессии подставить
источник

OT

Oleg Timkiv in Delphi & Lazarus
CreateProcess вернул false, ок! мы создали новую сессию в новую паку распаковали  7za.exe, почему у следующих сессий падает?
источник

VA

Viktor Akselrod in Delphi & Lazarus
Yerlan Assanov
Вы про stream.7z?
про оба

плюс про утечку хендлов процесса и потока выше уже написали. это надо отрабатывать
источник

VA

Viktor Akselrod in Delphi & Lazarus
и добавьте логирование. у вас куча точек выхода
источник