Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3      [все]
 Не корректно работает CreateProcess.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
Как всегда, раньше всё работало, а сейчас не хочет. Причину понять не могу.
Если в лоб то CreateProcess работает только если я вызываю его напрямую (например на нажатие кнопки):
Вот тут всё работает:

procedure TForm1.TestClick(Sender: TObject);
var
  si: TStartupInfo;
  pi: TProcessInformation;
begin
    CreateProcess (nil, PAnsiChar('Calculation002\001\CORE_1.exe'), nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, si, pi);
   //прямой путь тоже работает
end;

А вот так - нет:

procedure Test2;
var
  si: TStartupInfo;
  pi: TProcessInformation;
Begin
   CreateProcess (nil, PAnsiChar('Calculation002\001\CORE_1.exe'), nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, si, pi);
end;

procedure TCoreShell.TestClick(Sender: TObject);
begin
 Test2;
end;

и выдает ошибку с картинки.

К сообщению приложен файл. Размер - 5Kb
4 авг 19, 17:38    [21941618]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
Изначально ошибка возникла в потоке, где было ещё непонятнее, при наличии параметров CreateProcess выдавала успех и Handle, который потом успешно проверялся на существование, но нужную мне программу не запускала.

При отключении параметров и выборе чисто пути к файлу (ну для теста), выдавала ошибку с картинки.

Но ShellExecute в том же коде и в том же месте работает прекрасно (но мне то Хандл нужен..).

При том ранее код работал и ничего принципиального не менял (вроде как в CreateProcess вообще параметры один в один приходят как раньше, но не уверен).
В чем может быть причина?

К сообщению приложен файл. Размер - 8Kb
4 авг 19, 17:40    [21941620]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Gator
Member

Откуда: Москва
Сообщений: 14978
Андрей Игоревич,

Кто будет выделять память и заполнять SI и PI?
4 авг 19, 17:47    [21941621]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
asutp2
Member

Откуда: Тюмень
Сообщений: 549
Андрюха,

переменную si инициализировать кто будет?
4 авг 19, 17:50    [21941622]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
ёёёёё
Member

Откуда:
Сообщений: 1295
У меня тут компа нет, и интернета тоже нет.
Но вот, например:
CreateProcess (nil, PAnsiChar('Calculation002\001\CORE_1.exe'),...

Если у тебя юникодный дельфи, то не следует ли использовать просто pchar? Хотя, тут просто приведение типа к указателю, но ведь пчар у нас волшебный тип...

И, еще. Если тут работает, а тут нет - посмотри на меня ициализацию параметров. Возможно, их таки требуется инициализировать. В MSDN глянь.
4 авг 19, 17:53    [21941625]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
asutp2
Андрюха,

переменную si инициализировать кто будет?

Gator
Андрей Игоревич,

Кто будет выделять память и заполнять SI и PI?

Так этож записи, яж их в варе призвал.
А заполнять - там же куча параметров, которые (по крайней мере для теста) мне не нужны, и как я понимал из описания - не требуют присвоения (хотя, может, ошибся), но неужто мне всю это надо прописывать каждый раз, мне даже вникать то в них было лень, всякие координаты левого угла, активные мониторы и прочее...?
+
TStartUpInfo = record
cb: Longword; 
lpReserved: PChar; 
lpDesktop: PChar; 
lpTitle: PChar; 
dwX: Longword; 
dwY: Longword; 
dwXSize: Longword; 
dwYSize: Longword; 
dwXCountChars: Longword; 
dwYCountChars: Longword; 
dwFillAttribute: Longword; 
dwFlags: Longword; 
wShowWindow: Word; 
cbReserved2: Word; 
lpReserved2: PByte; 
hStdInput: THandle; 
hStdOutput: THandle; 
hStdError: THandle;
end;


ёёёёё
У меня тут компа нет, и интернета тоже нет.
Но вот, например:
CreateProcess (nil, PAnsiChar('Calculation002\001\CORE_1.exe'),...

Если у тебя юникодный дельфи, то не следует ли использовать просто pchar? Наверно стоит, но не это причина ошибки...

ёёёёё
И, еще. Если тут работает, а тут нет - посмотри на меня ициализацию параметров. Возможно, их таки требуется инициализировать. В MSDN глянь.

Ну надо глянуть, "но раньше то работало", и при вызове с кнопки тоже работает, там как то иначе инициализируется запись?
4 авг 19, 18:05    [21941636]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48611

Андрей Игоревич
Так этож записи, яж их в варе призвал.

Поэтому они забиты мусором и не проходят проверку валидности. Не выпендривайся, инициализируй.

Posted via ActualForum NNTP Server 1.5

4 авг 19, 18:08    [21941639]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
Андрей Игоревич,

Не...

Так работает

procedure TCoreShell.TestClick(Sender: TObject);
var
  si: TStartupInfo;
  pi: TProcessInformation;
begin
 //Test2 (si);
  CreateProcess (nil, PAnsiChar('Calculation002\001\CORE_1.exe'), nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, si, pi);
end;


А так - нет

procedure Test2 (si: TStartupInfo);
var
  //si: TStartupInfo;
  pi: TProcessInformation;
Begin
  CreateProcess (nil, PChar('Calculation002\001\CORE_1.exe'), nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, si, pi);
end;

procedure TCoreShell.TestClick(Sender: TObject);
var
  si: TStartupInfo;
  pi: TProcessInformation;

begin
 Test2 (si);
//  CreateProcess (nil, PAnsiChar('Calculation002\001\CORE_1.exe'), nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, si, pi);
end;
4 авг 19, 18:10    [21941640]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
Андрей Игоревич,
Ладно, признаю свою ошибку, программа по крайней мере запускается (хотя и как-то странно) после того как прописал
 
   si.lpDesktop:=nil;

Зачем, почему, и вообще что я тут должен писать... Теперь чтоль все параметры прописывать...
Может это из-за двух мониторов, блин, теперь кучу времени вникать в параметры, эх, а в статье про CreateProcess писали - хорошая функция, простая, а параметры вам не нужны...
4 авг 19, 18:19    [21941645]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48611

Андрей Игоревич
Теперь чтоль все параметры прописывать...

Во всех примерах структуры сначала обнуляются целиком (FillChar()), а потом удёт
присвоение одному-двум нужным параметрам.

И читать надо было документацию, а не левую статью какого-то ламера.

Posted via ActualForum NNTP Server 1.5

4 авг 19, 18:26    [21941651]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
Dimitry Sibiryakov
Андрей Игоревич
Теперь чтоль все параметры прописывать...

Во всех примерах структуры сначала обнуляются целиком (FillChar()), а потом удёт
присвоение одному-двум нужным параметрам.

И читать надо было документацию, а не левую статью какого-то ламера.


Ага, нашел, вроде то.

FillChar(si, SizeOf(STARTUPINFO), 0);
si.cb := SizeOf(TStartUpInfo);
4 авг 19, 18:47    [21941666]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
ёёёёё
Member

Откуда:
Сообщений: 1295
Андрей Игоревич
...

ёёёёё
И, еще. Если тут работает, а тут нет - посмотри на меня ициализацию параметров. Возможно, их таки требуется инициализировать. В MSDN глянь.

Ну надо глянуть, "но раньше то работало", и при вызове с кнопки тоже работает, там как то иначе инициализируется запись?


1. Никто не знает, когда наступит час Суда, кроме Аллаху Субхану ва Тааля.
2. Никто не знает когда, где и сколько дождя прольется с неба, кроме Аллаха.
3. Никто наверняка не знает, что происходит в утробе беременной женщины, кроме Всевышнего.
4. Ни один человек не знает, что принесет ему завтрашний день и какое его будущее ожидает, кроме Аллаха.
5. Никто, кроме Всевышнего Аллаха, не знает, на какой земле, когда и каким образом прекратится его жизнь в этом мире.

...поэтому, если вера твоя недостаточно крепка, параметры следует инициализировать явно.
4 авг 19, 19:06    [21941671]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
alekcvp
Member

Откуда:
Сообщений: 1633
Андрей Игоревич
Ага, нашел, вроде то.

FillChar(si, SizeOf(STARTUPINFO), 0);
si.cb := SizeOf(TStartUpInfo);

Лучше всё-таки использовать один тип - тот, с которым она объявлена. Конкретно в этом месте это некритично, но привычку лучше завести, иначе в другой ситуации при рефакторинге, например, могут быть сюрпризы.
4 авг 19, 19:22    [21941679]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Cobalt747
Member

Откуда:
Сообщений: 2128
FillChar(si, SizeOf(si), 0);
si.cb := SizeOf(si);
5 авг 19, 10:44    [21941923]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Василий 2
Member

Откуда:
Сообщений: 799
Забудьте вы про замшелый FillChar, пора юзать Default.
Да, и странно, что никто не вспомнил, что CmdLine не должна быть константой - см. MSDN по CreateProcessW
5 авг 19, 13:40    [21942071]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
Понимаю, что опять люди напишут мнение обо мне своё мнение :) , но что-то не могу сообразить. А в мануалах на английском как-то тону сам...
Как работает IsWindow(Handle) или как корректно работать с Handle;

Запускаю процесс через CreateProcess, далее процесс закрывается руками (крестиком на форме), но крутящаяся в цикле в потоке IsWindow продолжает выдавать True на вопрос о его существование;

          CreateProcess (nil, PChar(Core_1Path+parameters), nil, nil, true, CREATE_NEW_CONSOLE, nil, PChar(DirPath), si, pi);
          WaitForInputIdle(pi.hProcess, INFINITE);
          CloseHandle(pi.hProcess); //закрытие или нет тут ни на что не влияет
          CloseHandle(pi.hThread);
          


Далее в цикле в крутится

        if  IsWindow(pi.hProcess) then ...; 
        sleep (100);

И при закрытии "руками" - IsWindow(MyHandle) всё равно выдает True.

Если же убить процесс через
TerminateProcess(pi.hProcess, 0);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);

то тогда всё нормально и IsWindow уже выдает false;
Вопрос - почему так, видимо я не понимаю что есть handle или как оно работает.

П.С. Я знаю что можно ожидать завершения процесса через WaitforSingleObject, но тут уже более осозновательный интерес. Ведь если IsWindow выдает true - значит идет утечка?
5 авг 19, 16:33    [21942219]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1375
Андрей Игоревич,

хмм, странная практика - передавать хендл процесса туда где нужен хендл окна. плюс, в хелпе пишут, что не рекомендуют использовать IsWindow для определения окон в других потоках. а цель какая?
5 авг 19, 16:42    [21942231]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
Zelius
Андрей Игоревич,

хмм, странная практика - передавать хендл процесса туда где нужен хендл окна. плюс, в хелпе пишут, что не рекомендуют использовать IsWindow для определения окон в других потоках. а цель какая?

Из основной программы запускаю расчетные модули, расчетные модули считают (нередко долго, часы и дни каждый), по завершении сами закрываются, иногда надо запустить до сотни расчетных модулей, запускать их все - сами понимаете, потому нужно отслеживать сколько их запущено в данный момент и дозапускать по мере закрытия. Сделать это можно разными способами (до того сделал простым пересчетом процессов по имени), теперь вот решил попробовать запомнить Хандлы и раз в некоторое время проверять на "запущенность". Но как-то не получилось :).
5 авг 19, 17:04    [21942252]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30556

05.08.2019 17:04, Андрей Игоревич пишет:
> ...проверять на "запущенность".
> Но как-то не получилось...

обучаю аппендэктомии (trans tonsils).
по переписке.

Posted via ActualForum NNTP Server 1.5

5 авг 19, 17:09    [21942259]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48611

Андрей Игоревич
Но как-то не получилось :).

Потому что неправильно пробовал. Не надо закрывать хэндл запущенного процесса. Надо
периодически проверять через GetExitCodeProcess() его состояние и закрывать хэндл только
после получения чего-то отличного от STILL_ACTIVE. И запускать после этого новый процесс.

А лучше всё-таки использовать потоки и паттерн producer-consumer для раздавания им заданий
для обработки.

Posted via ActualForum NNTP Server 1.5

5 авг 19, 17:11    [21942262]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30556

05.08.2019 17:11, Dimitry Sibiryakov пишет:
> А лучше всё-таки использовать потоки

не внемлет.
ибо играет вдохновенно...

Posted via ActualForum NNTP Server 1.5

5 авг 19, 17:15    [21942269]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48611

Dimitry Sibiryakov
Надо периодически проверять через GetExitCodeProcess() его состояние

Или лучше даже не проверять, а просто ожидать завершения любого из них с помощью
WaitForMultipleObjects().

Мимопроходящий
не внемлет.

Ну, для тех, у кого "расчетные модули" могут внезапно упасть на вторые сутки работы, это
может быть необходимым костылём.

Posted via ActualForum NNTP Server 1.5

5 авг 19, 17:22    [21942279]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
alekcvp
Member

Откуда:
Сообщений: 1633
Андрей Игоревич
Из основной программы запускаю расчетные модули, расчетные модули считают (нередко долго, часы и дни каждый), по завершении сами закрываются, иногда надо запустить до сотни расчетных модулей, запускать их все - сами понимаете, потому нужно отслеживать сколько их запущено в данный момент и дозапускать по мере закрытия.

ИМХО, я бы сделал отдельный поток для управления этими процессами, в который бы засунул семафор для управления потоком и массив хэндлов для процессов, после чего в цикле запускал бы нужное количество процессов и делал WaitForMultiplyObjects(...., INFINITE) для семафора и процессов. Пока процессы работают - он спит и не потребляет ресурсы, когда какой-то процесс завершается мы в цикле перебираем массив вызовом GetExitCodeProcess(), закрываем хэндлы неактивных процессов и перезапускаем их, после чего снова ждём. Если сработал семафор - завершаем поток. По желанию можно при этом принудительно завершить все вторичные процессы.

Управлять потоком из гуя - через семафор.
5 авг 19, 17:23    [21942282]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30556

05.08.2019 17:23, alekcvp пишет:
> Управлять потоком из гуя - через семафор.

гуй не нужен

Posted via ActualForum NNTP Server 1.5

5 авг 19, 17:25    [21942283]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
alekcvp
Member

Откуда:
Сообщений: 1633
alekcvp,

Можно не перебирать, а сразу перезапускать нужный, т.к. индекс мы знаем после Wait...()
5 авг 19, 17:25    [21942285]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
alekcvp
Member

Откуда:
Сообщений: 1633
Мимопроходящий
05.08.2019 17:23, alekcvp пишет:
> Управлять потоком из гуя - через семафор.
гуй не нужен

Даже если эта служба, то MMC - тоже гуй :)
5 авг 19, 17:26    [21942288]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48611

alekcvp
MMC - тоже гуй :)

MMC не нужен. Тормозной.

Posted via ActualForum NNTP Server 1.5

5 авг 19, 17:30    [21942296]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
Dimitry Sibiryakov
Андрей Игоревич
Но как-то не получилось :).

Потому что неправильно пробовал.

Жизнь боль.
Dimitry Sibiryakov
Не надо закрывать хэндл запущенного процесса. Надо
периодически проверять через GetExitCodeProcess() его состояние и закрывать хэндл только
после получения чего-то отличного от STILL_ACTIVE. И запускать после этого новый процесс.
Спасибо, буду пробовать. Потоки в общем-то и использовал (и использую), там всё и крутилось (ожидалось и запускалось), просто решил об этом не писать, суть задачи они не меняют
Dimitry Sibiryakov
А лучше всё-таки использовать потоки и паттерн producer-consumer для раздавания им заданий
для обработки.

Надо понять, что это за зверь и с чем его едят.
Dimitry Sibiryakov
Или лучше даже не проверять, а просто ожидать завершения любого из них с помощью
WaitForMultipleObjects().
alekcvp
ИМХО, я бы сделал отдельный поток для управления этими процессами, в который бы засунул семафор для управления потоком и массив хэндлов для процессов, после чего в цикле запускал бы нужное количество процессов и делал WaitForMultiplyObjects(...., INFINITE) для семафора и процессов. Пока процессы работают - он спит и не потребляет ресурсы, когда какой-то процесс завершается мы в цикле перебираем массив вызовом GetExitCodeProcess(), закрываем хэндлы неактивных процессов и перезапускаем их, после чего снова ждём. Если сработал семафор - завершаем поток. По желанию можно при этом принудительно завершить все вторичные процессы.

Управлять потоком из гуя - через семафор.

В принципе в порядке саморазвития уже так и сделал, и даже работает. Правда пока не знаю что такое "Управлять потоком из гуя - через семафор" - надо почитать... А нормально, что будет висеть, например 15 потоков (на 16 ядрах обычно так запускают) которые только и делают, что ждут завершения программ.
5 авг 19, 17:38    [21942306]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11257
Андрей Игоревич
А нормально, что будет висеть, например 15 потоков (на 16 ядрах обычно так запускают) которые только и делают, что ждут завершения программ.
Один поток может ждать до 64 хэндлов
5 авг 19, 17:41    [21942315]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48611

Андрей Игоревич
А нормально, что будет висеть, например 15 потоков (на 16 ядрах обычно так запускают)
которые только и делают, что ждут завершения программ.

Нет, ненормально. Такую мелочь можно (и нужно) ждать в одном потоке.

Posted via ActualForum NNTP Server 1.5

5 авг 19, 17:43    [21942319]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
Dimitry Sibiryakov
Андрей Игоревич
А нормально, что будет висеть, например 15 потоков (на 16 ядрах обычно так запускают)
которые только и делают, что ждут завершения программ.

Нет, ненормально. Такую мелочь можно (и нужно) ждать в одном потоке.

Ясно, понял, пошел читать.
5 авг 19, 17:46    [21942324]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Василий 2
Member

Откуда:
Сообщений: 799
WaitFor и прочее это хорошо, но здесь особо не нужно.
- Заводим массив ComputingProcs размера N
- В цикле запускаем процессы, занося в ячейки массива полученные значения hProcess
- (опционально в фоновом потоке) по таймеру в цикле пробегаем по массиву, определяем через GetProcessExitCode (точно название не помню), какой процесс завершился, обнуляем эту ячейку.
- также в цикле на завершившиеся ячейки запускаем новые процессы (по желанию можно запускать новые сразу же, в предыдущем цикле)

Имхо, если процессы счетные и реально что-то делают, то больше сотни их запускать нерационально, а значит, тупой и простой как лом цикл с GetProcessExitCode по таймеру будет отрабатывать быстро. А это всё, что нужно ТС-у
5 авг 19, 17:50    [21942330]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48611

Самое превосходное, что WaitForMultileObjects именно это и делает: периодически пробегает
по массиву, определяет какой процесс завершился и сообщает об этом вызывателю, позволяя
ему обнулить ячейку и запустить новый процесс.

Posted via ActualForum NNTP Server 1.5

5 авг 19, 18:11    [21942349]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1602
alekcvp
ИМХО, я бы сделал отдельный поток для управления этими процессами


А я бы все работы обернул в поставщиков услуг... Сколько работ - столько сервисов (услуг). Их можно положить или в одну службу, или сгруппировать и положить в несколько служб, или каждый сервис (услугу) положить в собственную службу.
Их тогда можно разнести по разным серверам и сбалансировать нагрузку.
Дернул сервис - получил ответ (если сервис работу выполняет быстро). Если долго, то подписался на ответ.
А приложение дергает нужные сервисы...
Также всем сервисам можно сделать API в виде: Когда запускался последний раз, последний статус, текущий статус, сколько работает сейчас, и т.п.
Основное приложение через API может опрашивать их и принимать решения о перевызове и т.п.
5 авг 19, 18:31    [21942368]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
alekcvp
Member

Откуда:
Сообщений: 1633
X-Cite
alekcvp
ИМХО, я бы сделал отдельный поток для управления этими процессами

А я бы все работы обернул в поставщиков услуг... Сколько работ - столько сервисов (услуг).

Если расчётные модули уже есть готовые - смысл их переписывать, работа ради работы? А если их не ТС писал и исходников нет?..
5 авг 19, 18:58    [21942383]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1602
alekcvp
X-Cite
пропущено...

А я бы все работы обернул в поставщиков услуг... Сколько работ - столько сервисов (услуг).

Если расчётные модули уже есть готовые - смысл их переписывать, работа ради работы? А если их не ТС писал и исходников нет?..

А зачем их переписывать... Сделать обертку для вызова по soap/rest.
5 авг 19, 19:02    [21942385]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48611

И распихать по всему миру. В докер-контейнерах. Модно, стильно, молодёжно.

Posted via ActualForum NNTP Server 1.5

5 авг 19, 19:09    [21942388]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Gator
Member

Откуда: Москва
Сообщений: 14978
Андрей Игоревич
А в мануалах на английском как-то тону сам.

спасатели Малибу
5 авг 19, 19:43    [21942414]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Gator
Member

Откуда: Москва
Сообщений: 14978
+ Gator, Пардон, не ту ссылку вставил

гугло или другой транслятор
Функция CreateProcessA

12/05/2018
12 минут на чтение

Создает новый процесс и его основной поток. Новый процесс выполняется в контексте безопасности вызывающего процесса.

Если вызывающий процесс олицетворяет другого пользователя, новый процесс использует токен для вызывающего процесса, а не токен олицетворения. Чтобы запустить новый процесс в контексте безопасности пользователя, представленного маркером олицетворения, используйте функцию CreateProcessAsUser или CreateProcessWithLogonW .
Синтаксис
C++


BOOL CreateProcessA( LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation );


параметры

lpApplicationName

Имя модуля для выполнения. Этот модуль может быть приложением для Windows. Это может быть модуль другого типа (например, MS-DOS или OS / 2), если соответствующая подсистема доступна на локальном компьютере.

Строка может указывать полный путь и имя файла модуля для выполнения или частичное имя. В случае частичного имени функция использует текущий диск и текущий каталог для завершения спецификации. Функция не будет использовать путь поиска. Этот параметр должен включать расширение имени файла; расширение по умолчанию не предполагается.

Параметр lpApplicationName может иметь значение NULL . В этом случае имя модуля должно быть первым токеном с пробелами в строке lpCommandLine . Если вы используете длинное имя файла, которое содержит пробел, используйте строки в кавычках, чтобы указать, где заканчивается имя файла и начинаются аргументы; в противном случае имя файла неоднозначно. Например, рассмотрим строку «c: \ program files \ sub dir \ имя программы». Эта строка может быть интерпретирована несколькими способами. Система пытается интерпретировать возможности в следующем порядке:

c: \ program.exe c: \ program files \ sub.exe c: \ program files \ sub dir \ program.exe c: \ program files \ sub dir \ program name.exe Если исполняемый модуль является 16-разрядным приложением Значение lpApplicationName должно быть равно NULL , а строка, на которую указывает lpCommandLine, должна указывать исполняемый модуль, а также его аргументы.

Чтобы запустить командный файл, вы должны запустить интерпретатор команд; установите для lpApplicationName значение cmd.exe и задайте для lpCommandLine следующие аргументы: / c плюс имя пакетного файла.

lpCommandLine

Командная строка для выполнения.

Максимальная длина этой строки составляет 32 768 символов, включая завершающий нулевой символ Unicode. Если lpApplicationName равно NULL , часть имени модуля lpCommandLine ограничена символами MAX_PATH .

Версия этой функции Unicode, CreateProcessW , может изменять содержимое этой строки. Следовательно, этот параметр не может быть указателем на постоянную память (например, константную переменную или литеральную строку). Если этот параметр является константной строкой, функция может вызвать нарушение прав доступа.

Параметр lpCommandLine может иметь значение NULL. В этом случае функция использует строку, на которую указывает lpApplicationName, в качестве командной строки.

Если и lpApplicationName, и lpCommandLine не равны NULL , строка с нулевым символом в конце, на которую указывает lpApplicationName, указывает модуль для выполнения, а строка с нулевым символом в конце, на которую указывает lpCommandLine, указывает командную строку. Новый процесс может использовать GetCommandLine для получения всей командной строки. Консольные процессы, написанные на C, могут использовать аргументы argc и argv для разбора командной строки. Поскольку argv [0] является именем модуля, программисты на C обычно повторяют имя модуля в качестве первого токена в командной строке.

Если lpApplicationName имеет значение NULL, первый токен командной строки, разделенный пробелами, указывает имя модуля. Если вы используете длинное имя файла, которое содержит пробел, используйте строки в кавычках, чтобы указать, где заканчивается имя файла и начинаются аргументы (см. Объяснение параметра lpApplicationName ). Если имя файла не содержит расширения, добавляется .exe. Поэтому, если расширение имени файла - .com, этот параметр должен включать расширение .com. Если имя файла заканчивается точкой (.) Без расширения или если имя файла содержит путь, .exe не добавляется. Если имя файла не содержит путь к каталогу, система выполняет поиск исполняемого файла в следующей последовательности:

Каталог, из которого загружено приложение.
Текущий каталог для родительского процесса.
32-разрядный системный каталог Windows. Используйте функцию GetSystemDirectory, чтобы получить путь к этому каталогу.
16-битный системный каталог Windows. Не существует функции, которая получает путь к этому каталогу, но она ищется. Название этого каталога - System.
Каталог Windows. Используйте функцию GetWindowsDirectory, чтобы получить путь к этому каталогу.
Каталоги, перечисленные в переменной среды PATH. Обратите внимание, что эта функция не выполняет поиск пути для приложения, указанного в разделе реестра «Путь к приложению» . Чтобы включить этот путь для каждого приложения в последовательность поиска, используйте функцию ShellExecute .

Система добавляет завершающий нулевой символ в строку командной строки, чтобы отделить имя файла от аргументов. Это делит исходную строку на две строки для внутренней обработки.

lpProcessAttributes

Указатель на структуру SECURITY_ATTRIBUTES, которая определяет, могут ли возвращенные дескрипторы нового объекта процесса быть унаследованы дочерними процессами. Если lpProcessAttributes имеет значение NULL , дескриптор не может быть унаследован.

Член структуры lpSecurityDescriptor определяет дескриптор безопасности для нового процесса. Если lpProcessAttributes имеет значение NULL или lpSecurityDescriptor имеет значение NULL , процесс получает дескриптор безопасности по умолчанию. Списки ACL в дескрипторе безопасности по умолчанию для процесса происходят из основного токена создателя. Windows XP: списки ACL в дескрипторе безопасности по умолчанию для процесса происходят из основного маркера или маркера олицетворения создателя. Это поведение изменилось в Windows XP с пакетом обновления 2 и Windows Server 2003.

lpThreadAttributes

Указатель на структуру SECURITY_ATTRIBUTES, которая определяет, могут ли возвращенные дескрипторы нового объекта потока быть унаследованы дочерними процессами. Если lpThreadAttributes имеет значение NULL, дескриптор не может быть унаследован.

Член структуры lpSecurityDescriptor определяет дескриптор безопасности для основного потока. Если lpThreadAttributes имеет значение NULL или lpSecurityDescriptor имеет значение NULL, поток получает дескриптор безопасности по умолчанию. ACL в дескрипторе безопасности по умолчанию для потока происходят из токена процесса. Windows XP: ACL-списки в дескрипторе безопасности по умолчанию для потока происходят из основного маркера или маркера олицетворения создателя. Это поведение изменилось в Windows XP с пакетом обновления 2 и Windows Server 2003.

bInheritHandles

Если этот параметр равен TRUE, каждый наследуемый дескриптор в вызывающем процессе наследуется новым процессом. Если параметр FALSE, дескрипторы не наследуются. Обратите внимание, что унаследованные дескрипторы имеют то же значение и права доступа, что и исходные дескрипторы.

Службы терминалов: вы не можете наследовать дескрипторы между сеансами. Кроме того, если этот параметр равен TRUE, вы должны создать процесс в том же сеансе, что и вызывающая сторона.

Процессы Protected Process Light (PPL): наследование общего дескриптора блокируется, когда процесс PPL создает процесс не-PPL, поскольку PROCESS_DUP_HANDLE не допускается из процесса не-PPL в процесс PPL. См. Безопасность процесса и Права доступа

dwCreationFlags

Флаги, которые управляют классом приоритета и созданием процесса. Список значений см. В разделе « Флаги создания процесса» .

Этот параметр также управляет классом приоритета нового процесса, который используется для определения приоритетов планирования потоков процесса. Для получения списка значений см. GetPriorityClass . Если ни один из флагов класса приоритета не указан, классом приоритета по умолчанию является NORMAL_PRIORITY_CLASS, если только классом приоритета процесса создания не является IDLE_PRIORITY_CLASS или BELOW_NORMAL_PRIORITY_CLASS . В этом случае дочерний процесс получает класс приоритета по умолчанию вызывающего процесса.

lpEnvironment

Указатель на блок среды для нового процесса. Если этот параметр имеет значение NULL , новый процесс использует среду вызывающего процесса.

Блок окружения состоит из блока с нулевым символом в конце и строк с нулевым символом в конце. Каждая строка имеет следующую форму:

имя = значение \ 0

Поскольку знак равенства используется в качестве разделителя, его нельзя использовать в имени переменной среды.

Блок среды может содержать символы Unicode или ANSI. Если блок окружения, на который указывает lpEnvironment, содержит символы Юникода, убедитесь, что dwCreationFlags включает CREATE_UNICODE_ENVIRONMENT . Если этот параметр имеет значение NULL и блок среды родительского процесса содержит символы Unicode, вы также должны убедиться, что dwCreationFlags включает CREATE_UNICODE_ENVIRONMENT .

Версия ANSI этой функции CreateProcessA завершается ошибкой, если общий размер блока среды для процесса превышает 32 767 символов.

Обратите внимание, что блок среды ANSI завершается двумя нулевыми байтами: один для последней строки, еще один для завершения блока. Блок среды Unicode завершается четырьмя нулевыми байтами: два для последней строки, еще два для завершения блока.

lpCurrentDirectory

Полный путь к текущему каталогу процесса. Строка также может указывать путь UNC.

Если этот параметр имеет значение NULL , новый процесс будет иметь тот же текущий диск и каталог, что и вызывающий процесс. (Эта функция предоставляется в первую очередь для оболочек, которым необходимо запустить приложение и указать его начальный диск и рабочий каталог.)

lpStartupInfo

Указатель на структуру STARTUPINFO или STARTUPINFOEX .

Чтобы установить расширенные атрибуты, используйте структуру STARTUPINFOEX и укажите EXTENDED_STARTUPINFO_PRESENT в параметре dwCreationFlags .

Ручки в STARTUPINFO или STARTUPINFOEX должны быть закрыты с помощью CloseHandle, когда они больше не нужны.
Внимание! Вызывающий отвечает за то, чтобы стандартные поля дескриптора в STARTUPINFO содержали допустимые значения дескриптора. Эти поля копируются без изменений в дочерний процесс без проверки, даже когда член dwFlags указывает STARTF_USESTDHANDLES . Неправильные значения могут стать причиной неправильного поведения или сбоя дочернего процесса. Используйте инструмент проверки времени выполнения Application Verifier для обнаружения недействительных дескрипторов.

lpProcessInformation

Указатель на структуру PROCESS_INFORMATION, которая получает идентификационную информацию о новом процессе.

Дескрипторы в PROCESS_INFORMATION должны быть закрыты с помощью CloseHandle, когда они больше не нужны.
Возвращаемое значение

Если функция завершается успешно, возвращаемое значение отлично от нуля.

Если функция завершается ошибкой, возвращаемое значение равно нулю. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError .

Обратите внимание, что функция возвращается до того, как процесс завершил инициализацию. Если требуемая DLL не может быть найдена или не может быть инициализирована, процесс завершается. Чтобы получить статус завершения процесса, вызовите GetExitCodeProcess .
замечания

Процессу присваивается идентификатор процесса. Идентификатор действителен, пока процесс не завершится. Его можно использовать для идентификации процесса или указать в функции OpenProcess, чтобы открыть дескриптор процесса. Начальному потоку в процессе также назначается идентификатор потока. Это можно указать в функции OpenThread, чтобы открыть дескриптор потока. Идентификатор действителен до завершения потока и может использоваться для уникальной идентификации потока в системе. Эти идентификаторы возвращаются в структуре PROCESS_INFORMATION .

Имя исполняемого файла в командной строке, которое операционная система предоставляет процессу, не обязательно совпадает с именем в командной строке, которое вызывающий процесс дает функции CreateProcess . Операционная система может добавлять полный путь к имени исполняемого файла, который указан без полного пути.

Вызывающий поток может использовать функцию WaitForInputIdle, чтобы дождаться, пока новый процесс завершит свою инициализацию, и ожидает ввода данных пользователем без ожидания ввода. Это может быть полезно для синхронизации между родительскими и дочерними процессами, потому что CreateProcess возвращается, не дожидаясь, пока новый процесс завершит свою инициализацию. Например, процесс создания будет использовать WaitForInputIdle, прежде чем пытаться найти окно, связанное с новым процессом.

Предпочтительным способом завершения процесса является использование функции ExitProcess , поскольку эта функция отправляет уведомление о приближающемся завершении всем DLL-библиотекам, подключенным к процессу. Другие способы завершения процесса не уведомляют подключенные библиотеки DLL. Обратите внимание, что когда поток вызывает ExitProcess , другие потоки процесса завершаются без возможности выполнения какого-либо дополнительного кода (включая код завершения потока подключенных библиотек DLL). Для получения дополнительной информации см. Завершение процесса .

Родительский процесс может напрямую изменять переменные окружения дочернего процесса во время создания процесса. Это единственная ситуация, когда процесс может напрямую изменить параметры среды другого процесса. Для получения дополнительной информации см. Изменение переменных среды .

Если приложение предоставляет блок среды, информация о текущем каталоге системных дисков не распространяется автоматически на новый процесс. Например, существует переменная среды с именем = C: значением которой является текущий каталог на диске C. Приложение должно вручную передать информацию о текущем каталоге новому процессу. Для этого приложение должно явно создать эти строки переменных среды, отсортировать их в алфавитном порядке (поскольку система использует отсортированную среду) и поместить их в блок среды. Как правило, они идут в начале блока среды из-за порядка сортировки блоков среды.

Один из способов получения информации о текущем каталоге для диска X состоит в следующем вызове: GetFullPathName("X:", ...) . Это избавляет приложение от необходимости сканировать блок среды. Если возвращен полный путь X :, нет необходимости передавать это значение в качестве данных среды, поскольку корневой каталог является текущим каталогом по умолчанию для диска X нового процесса.

Когда процесс создается с указанным CREATE_NEW_PROCESS_GROUP , от имени нового процесса делается неявный вызов SetConsoleCtrlHandler ( NULL , TRUE ); это означает, что новый процесс отключил CTRL + C. Это позволяет оболочкам обрабатывать CTRL + C самостоятельно и выборочно передавать этот сигнал подпроцессам. CTRL + BREAK не отключен и может использоваться для прерывания процесса / группы процессов.
Замечания по безопасности
Первый параметр, lpApplicationName , может иметь значение NULL , и в этом случае имя исполняемого файла должно быть в строке, разделенной пробелами, на которую указывает lpCommandLine . Если в исполняемом файле или пути есть пробел, существует риск, что другой исполняемый файл может быть запущен из-за способа, которым функция разбирает пробелы. Следующий пример опасен, потому что функция попытается запустить «Program.exe», если он существует, вместо «MyApp.exe».


LPTSTR szCmdline = _tcsdup(TEXT("C:\\Program Files\\MyApp -L -S")); CreateProcess(NULL, szCmdline, /* ... */);


Если злонамеренный пользователь должен был создать в системе приложение «Program.exe», любая программа, которая неправильно вызывает CreateProcess с помощью каталога Program Files, будет запускать это приложение вместо намеченного приложения.

Чтобы избежать этой проблемы, не передавайте NULL для lpApplicationName . Если вы передадите NULL для lpApplicationName , используйте кавычки вокруг пути к исполняемому файлу в lpCommandLine , как показано в примере ниже.


LPTSTR szCmdline[] = _tcsdup(TEXT("\"C:\\Program Files\\MyApp\" -L -S")); CreateProcess(NULL, szCmdline, /*...*/);


Примеры

Пример см. В разделе « Создание процессов» .
Требования

Минимально поддерживаемый клиент Windows XP [настольные приложения | Приложения UWP]
Минимальный поддерживаемый сервер Windows Server 2003 [настольные приложения | Приложения UWP]
Целевая Платформа Windows
заголовок processsthreadsapi.h (включает Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008, Windows Server 2008 R2, Windows.h)
Библиотека kernel32.lib
DLL Kernel32.dll
Смотрите также

CloseHandle

CreateProcessAsUser

CreateProcessWithLogonW

ExitProcess

GetCommandLine

GetEnvironmentStrings

GetExitCodeProcess

GetFullPathName

GetStartupInfo

OpenProcess

ОБРАБАТЫВАТЬ ИНФОРМАЦИЮ

Функции процессов и потоков

Процессы

SECURITY_ATTRIBUTES

STARTUPINFO

STARTUPINFOEX

SetErrorMode

TerminateProcess

WaitForInputIdle
5 авг 19, 19:53    [21942421]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
Dimitry Sibiryakov
Андрей Игоревич
Но как-то не получилось :).

периодически проверять через GetExitCodeProcess() его состояние и закрывать хэндл только

В принципе замена IsWindow на GetExitCodeProcess превратила мой код в полностью рабочий, просто он намного примитивнее предложенного тут: я просто раз в секунду в потоке пробегал по всем Хэндлам, если процесс работает - значит прибавим один к счетчику (обнулённому в начале цикла), закончил работу - удаляем Хендл из массива (ну и тут теперь закрою хэндл). Далее если счетчик насчитал меньше чем число разрешенных процессов - дозапустим ещё прибавив запущенный хендл к массиву. Как я понял WaitForMultiplyObjects делает почти то же самое просто подвешивая поток и ожидая пока сработает условие (один/все) процессы закончились. Вот думаю, есть ли смысл через него, или пускай и так живет.

Василий 2
WaitFor и прочее это хорошо, но здесь особо не нужно.
- Заводим массив ComputingProcs размера N
- В цикле запускаем процессы, занося в ячейки массива полученные значения hProcess
- (опционально в фоновом потоке) по таймеру в цикле пробегаем по массиву, определяем через GetProcessExitCode (точно название не помню), какой процесс завершился, обнуляем эту ячейку.
- также в цикле на завершившиеся ячейки запускаем новые процессы (по желанию можно запускать новые сразу же, в предыдущем цикле)

Имхо, если процессы счетные и реально что-то делают, то больше сотни их запускать нерационально, а значит, тупой и простой как лом цикл с GetProcessExitCode по таймеру будет отрабатывать быстро. А это всё, что нужно ТС-у


А, ну да, вот так и сделал :), я в принципе изначально так и сделал, просто IsWindow меня подвел :).
Тут, конечно, много уж больно сложного напредлагали, думаю мне оно излишне.

Зато есть другой вопрос, расчетная программа имеет консоль куда раз в некоторое время выводится текущий статус расчета, один из параметров в принципе характеризует процент выполнения расчета, насколько сложно из сторонней программы считать последнюю строку в консоли дабы нарисовать красивый столбец прогресбаров в своей программе. Способ указанный в данной теме самый простой? https://www.sql.ru/forum/887984/zapustit-s-delphi-konsolnoe-prilozhenie-i-schitat-ego-vyvod

Всем спасибо, очень помогли уже не один раз.
6 авг 19, 15:56    [21943061]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30556

06.08.2019 15:56, Андрей Игоревич пишет:
> расчетная программа имеет консоль куда раз в некоторое время выводится текущий статус расчета,
> один из параметров в принципе характеризует процент выполнения расчета, насколько сложно из сторонней
> программы считать последнюю строку в консоли дабы нарисовать...

ну вот опять ты пытаешься решать задачи через ж@пу.
есть туева хуча способов обмена информацией между процессами:
https://docs.microsoft.com/en-us/windows/win32/ipc/interprocess-communications

нет блин, "что вижу, то пою!"
акын, ити йо медь...

Posted via ActualForum NNTP Server 1.5

6 авг 19, 16:04    [21943070]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
Мимопроходящий
06.08.2019 15:56, Андрей Игоревич пишет:
> расчетная программа имеет консоль куда раз в некоторое время выводится текущий статус расчета,
> один из параметров в принципе характеризует процент выполнения расчета, насколько сложно из сторонней
> программы считать последнюю строку в консоли дабы нарисовать...

ну вот опять ты пытаешься решать задачи через ж@пу.
есть туева хуча способов обмена информацией между процессами:
https://docs.microsoft.com/en-us/windows/win32/ipc/interprocess-communications

нет блин, "что вижу, то пою!"
акын, ити йо медь...

Тут ключевая проблема в том, что я ну очень, очень сильно не хочу лезть в код расчетного модуля, во первых он не мой, во вторых к нему куча требований, в третьих он проходит аттестацию в ростехнадзоре (там, кстати, требуют (ну лет 5-7 назад ещё требовали) распечатку всего кода в виде отдельного документа, не знаю даже победили ли этот маразм сейчас).

Расчетный код почти всегда с точки зрения программирования предельно примитивен, самое сложное что там используется это открытие и сохранение файлов (ну и я впихнул туда параметры для запуска из своей оболочки), остальное десятки тысяч строк кода адовой, ломающей мозг математики.
6 авг 19, 16:36    [21943094]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30556

раз ты туда что-то "впихнул", значит можешь направить "выхлоп" этого модуля
не только в консоль, но и куда-нибудь ещё.
например, тупо в файл.

остальное - отговорки.

Posted via ActualForum NNTP Server 1.5

6 авг 19, 16:44    [21943101]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48611

Мимопроходящий
например, тупо в файл.

А правильнее - тупо в pipe, приход данных из которой, по счастливой случайности, можно тем
же самым WaitForMultipleObjects(), которым ожидается и завершение работы собственно модуля.

Posted via ActualForum NNTP Server 1.5

6 авг 19, 16:49    [21943109]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11257
Мимопроходящий
не только в консоль, но и куда-нибудь ещё.
например, тупо в файл.
А зачем? Ну не нужно рассчетнику никакое IPC. А кому нужно - пайпы в зубы и вперед
6 авг 19, 16:51    [21943111]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30556

06.08.2019 16:51, _Vasilisk_ пишет:
> А зачем?

не ко мне вопрос.

Posted via ActualForum NNTP Server 1.5

6 авг 19, 16:54    [21943114]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11257
Мимопроходящий
> А зачем?
не ко мне вопрос.
Именно к тебе. Ты предлагаешь модифицировать работающий модуль.
6 авг 19, 16:57    [21943117]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30556

06.08.2019 16:57, _Vasilisk_ пишет:
> Именно к тебе. Ты предлагаешь модифицировать работающий модуль.

он его УЖЕ модифицировал.

Posted via ActualForum NNTP Server 1.5

6 авг 19, 17:02    [21943120]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11257
Мимопроходящий
он его УЖЕ модифицировал.
А ты предлагаешь ломать дальше. Сгорел сарай, гори и хата...
6 авг 19, 17:12    [21943133]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Василий 2
Member

Откуда:
Сообщений: 799
Если вывод WriteLn-ом, то перенаправлять трубы. Ну и буферизация вывода может подкузьмить. Если же вывод напрямую в окно консоли, то облом.
6 авг 19, 17:15    [21943136]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11257
Василий 2
Если же вывод напрямую в окно консоли, то облом.
Т.е. Writeln использует свою секретную магию? Какой облом?
6 авг 19, 17:22    [21943143]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
Мимопроходящий
раз ты туда что-то "впихнул", значит можешь направить "выхлоп" этого модуля
не только в консоль, но и куда-нибудь ещё.
например, тупо в файл.

остальное - отговорки.

Можно в файл, можно в пайп, всё можно, просто очень не хочется, главное чтоб было суперстабильно и минимально с точки зрения кода, а я в себе не настолько уверен (ну хотя в файл скинуть не проблема, да в принципе и так расчетная программа в файл сохраняет периодически и можно оттуда подгружать это параметр). Да и взаимодействие с авторами кода в данный момент ограничено, а втыкать в не самый простой чужой код свои процедуры...

Просто раз уж и так выводит в консоль, подумал, чего лишний раз дергать чужой код. Ну и данный функционал из раздела "хочу чтоб было красиво", с точки зрения авторов расчетного кода это всё не очень важно (командная строка и тысячастрочные файлы исходных данных правящиеся в ручную "наше всё").
6 авг 19, 17:29    [21943150]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 229
Василий 2
Если вывод WriteLn-ом, то перенаправлять трубы. Ну и буферизация вывода может подкузьмить. Если же вывод напрямую в окно консоли, то облом.

Ага, WriteLn-ом, ясно, буду раздираться...
6 авг 19, 17:32    [21943152]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30556

06.08.2019 17:22, _Vasilisk_ пишет:
В2 >> Если же вывод напрямую в окно консоли, то облом.
> Т.е. Writeln использует свою секретную магию? Какой облом?

не нужно передёргивать.
твой тёзка имел в виду https://docs.microsoft.com/en-us/windows/console/low-level-console-output-functions

Posted via ActualForum NNTP Server 1.5

6 авг 19, 17:36    [21943156]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Василий 2
Member

Откуда:
Сообщений: 799
Только надо учесть, что если труба из читающего конца не вычитывается, то на пишущем конце запись виснет.
7 авг 19, 10:19    [21943517]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48611

Василий 2
если труба из читающего конца не вычитывается, то на пишущем конце запись виснет.

И восхитительная особенность WaitForXXXObject() заключается в том, что оно немедленно
сообщит если в трубе появилось что-то на вычитывание.

Posted via ActualForum NNTP Server 1.5

7 авг 19, 13:18    [21943748]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Василий 2
Member

Откуда:
Сообщений: 799
Dimitry Sibiryakov
Василий 2
если труба из читающего конца не вычитывается, то на пишущем конце запись виснет.

И восхитительная особенность WaitForXXXObject() заключается в том, что оно немедленно
сообщит если в трубе появилось что-то на вычитывание.

Это со стороны читателя поможет. А вот если читатель застрял, то писатель, который знать не знает про трубы, также зависнет на WriteLn на неопределенный срок
7 авг 19, 14:54    [21943843]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Gator
Member

Откуда: Москва
Сообщений: 14978
Василий 2
то писатель, который знать не знает про трубы, также зависнет на WriteLn на неопределенный срок
С какой стати?
7 авг 19, 15:07    [21943862]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48611

Василий 2
Это со стороны читателя поможет. А вот если читатель застрял, то писатель, который знать
не знает про трубы, также зависнет на WriteLn на неопределенный срок
Ну так именно это и поможет читателю не застрять. Что и требовалось.

Posted via ActualForum NNTP Server 1.5

7 авг 19, 16:24    [21943959]     Ответить | Цитировать Сообщить модератору
 Re: Не корректно работает CreateProcess.  [new]
Василий 2
Member

Откуда:
Сообщений: 799
Dimitry Sibiryakov
Ну так именно это и поможет читателю не застрять. Что и требовалось.

Я имел в виду случай, когда читатель застрял по другой причине
7 авг 19, 18:56    [21944105]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3      [все]
Все форумы / Delphi Ответить