|
|
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
Как всегда, раньше всё работало, а сейчас не хочет. Причину понять не могу. Если в лоб то CreateProcess работает только если я вызываю его напрямую (например на нажатие кнопки): Вот тут всё работает: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. А вот так - нет: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. и выдает ошибку с картинки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2019, 17:38 |
|
||
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
Изначально ошибка возникла в потоке, где было ещё непонятнее, при наличии параметров CreateProcess выдавала успех и Handle, который потом успешно проверялся на существование, но нужную мне программу не запускала. При отключении параметров и выборе чисто пути к файлу (ну для теста), выдавала ошибку с картинки. Но ShellExecute в том же коде и в том же месте работает прекрасно (но мне то Хандл нужен..). При том ранее код работал и ничего принципиального не менял (вроде как в CreateProcess вообще параметры один в один приходят как раньше, но не уверен). В чем может быть причина? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2019, 17:40 |
|
||
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, Кто будет выделять память и заполнять SI и PI? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2019, 17:47 |
|
||
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
Андрюха, переменную si инициализировать кто будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2019, 17:50 |
|
||
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
У меня тут компа нет, и интернета тоже нет. Но вот, например: Код: pascal 1. Если у тебя юникодный дельфи, то не следует ли использовать просто pchar? Хотя, тут просто приведение типа к указателю, но ведь пчар у нас волшебный тип... И, еще. Если тут работает, а тут нет - посмотри на меня ициализацию параметров. Возможно, их таки требуется инициализировать. В MSDN глянь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2019, 17:53 |
|
||
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
asutp2Андрюха, переменную si инициализировать кто будет? GatorАндрей Игоревич, Кто будет выделять память и заполнять SI и PI? Так этож записи, яж их в варе призвал. А заполнять - там же куча параметров, которые (по крайней мере для теста) мне не нужны, и как я понимал из описания - не требуют присвоения (хотя, может, ошибся), но неужто мне всю это надо прописывать каждый раз, мне даже вникать то в них было лень, всякие координаты левого угла, активные мониторы и прочее...? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ёёёёёУ меня тут компа нет, и интернета тоже нет. Но вот, например: Код: pascal 1. Если у тебя юникодный дельфи, то не следует ли использовать просто pchar? Наверно стоит, но не это причина ошибки... ёёёёёИ, еще. Если тут работает, а тут нет - посмотри на меня ициализацию параметров. Возможно, их таки требуется инициализировать. В MSDN глянь. Ну надо глянуть, "но раньше то работало", и при вызове с кнопки тоже работает, там как то иначе инициализируется запись? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2019, 18:05 |
|
||
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичТак этож записи, яж их в варе призвал. Поэтому они забиты мусором и не проходят проверку валидности. Не выпендривайся, инициализируй. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2019, 18:08 |
|
||
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, Не... Так работает Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. А так - нет Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2019, 18:10 |
|
||
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, Ладно, признаю свою ошибку, программа по крайней мере запускается (хотя и как-то странно) после того как прописал Код: pascal 1. 2. Зачем, почему, и вообще что я тут должен писать... Теперь чтоль все параметры прописывать... Может это из-за двух мониторов, блин, теперь кучу времени вникать в параметры, эх, а в статье про CreateProcess писали - хорошая функция, простая, а параметры вам не нужны... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2019, 18:19 |
|
||
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичТеперь чтоль все параметры прописывать... Во всех примерах структуры сначала обнуляются целиком (FillChar()), а потом удёт присвоение одному-двум нужным параметрам. И читать надо было документацию, а не левую статью какого-то ламера. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2019, 18:26 |
|
||
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovАндрей ИгоревичТеперь чтоль все параметры прописывать... Во всех примерах структуры сначала обнуляются целиком (FillChar()), а потом удёт присвоение одному-двум нужным параметрам. И читать надо было документацию, а не левую статью какого-то ламера. Ага, нашел, вроде то. FillChar(si, SizeOf(STARTUPINFO), 0); si.cb := SizeOf(TStartUpInfo); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2019, 18:47 |
|
||
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич... ёёёёёИ, еще. Если тут работает, а тут нет - посмотри на меня ициализацию параметров. Возможно, их таки требуется инициализировать. В MSDN глянь. Ну надо глянуть, "но раньше то работало", и при вызове с кнопки тоже работает, там как то иначе инициализируется запись? 1. Никто не знает, когда наступит час Суда, кроме Аллаху Субхану ва Тааля. 2. Никто не знает когда, где и сколько дождя прольется с неба, кроме Аллаха. 3. Никто наверняка не знает, что происходит в утробе беременной женщины, кроме Всевышнего. 4. Ни один человек не знает, что принесет ему завтрашний день и какое его будущее ожидает, кроме Аллаха. 5. Никто, кроме Всевышнего Аллаха, не знает, на какой земле, когда и каким образом прекратится его жизнь в этом мире. ...поэтому, если вера твоя недостаточно крепка, параметры следует инициализировать явно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2019, 19:06 |
|
||
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичАга, нашел, вроде то. FillChar(si, SizeOf( STARTUPINFO ), 0); si.cb := SizeOf( TStartUpInfo ); Лучше всё-таки использовать один тип - тот, с которым она объявлена. Конкретно в этом месте это некритично, но привычку лучше завести, иначе в другой ситуации при рефакторинге, например, могут быть сюрпризы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2019, 19:22 |
|
||
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2019, 10:44 |
|
||
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
Забудьте вы про замшелый FillChar, пора юзать Default. Да, и странно, что никто не вспомнил, что CmdLine не должна быть константой - см. MSDN по CreateProcessW ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2019, 13:40 |
|
||
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
Понимаю, что опять люди напишут мнение обо мне своё мнение :) , но что-то не могу сообразить. А в мануалах на английском как-то тону сам... Как работает IsWindow(Handle) или как корректно работать с Handle; Запускаю процесс через CreateProcess, далее процесс закрывается руками (крестиком на форме), но крутящаяся в цикле в потоке IsWindow продолжает выдавать True на вопрос о его существование; Код: pascal 1. 2. 3. 4. 5. Далее в цикле в крутится Код: pascal 1. 2. И при закрытии "руками" - IsWindow(MyHandle) всё равно выдает True. Если же убить процесс через Код: pascal 1. 2. 3. то тогда всё нормально и IsWindow уже выдает false; Вопрос - почему так, видимо я не понимаю что есть handle или как оно работает. П.С. Я знаю что можно ожидать завершения процесса через WaitforSingleObject, но тут уже более осозновательный интерес. Ведь если IsWindow выдает true - значит идет утечка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2019, 16:33 |
|
||
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, хмм, странная практика - передавать хендл процесса туда где нужен хендл окна. плюс, в хелпе пишут, что не рекомендуют использовать IsWindow для определения окон в других потоках. а цель какая? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2019, 16:42 |
|
||
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
ZeliusАндрей Игоревич, хмм, странная практика - передавать хендл процесса туда где нужен хендл окна. плюс, в хелпе пишут, что не рекомендуют использовать IsWindow для определения окон в других потоках. а цель какая? Из основной программы запускаю расчетные модули, расчетные модули считают (нередко долго, часы и дни каждый), по завершении сами закрываются, иногда надо запустить до сотни расчетных модулей, запускать их все - сами понимаете, потому нужно отслеживать сколько их запущено в данный момент и дозапускать по мере закрытия. Сделать это можно разными способами (до того сделал простым пересчетом процессов по имени), теперь вот решил попробовать запомнить Хандлы и раз в некоторое время проверять на "запущенность". Но как-то не получилось :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2019, 17:04 |
|
||
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
05.08.2019 17:04, Андрей Игоревич пишет: > ...проверять на "запущенность". > Но как-то не получилось... обучаю аппендэктомии (trans tonsils). по переписке. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2019, 17:09 |
|
||
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичНо как-то не получилось :). Потому что неправильно пробовал. Не надо закрывать хэндл запущенного процесса. Надо периодически проверять через GetExitCodeProcess() его состояние и закрывать хэндл только после получения чего-то отличного от STILL_ACTIVE. И запускать после этого новый процесс. А лучше всё-таки использовать потоки и паттерн producer-consumer для раздавания им заданий для обработки. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2019, 17:11 |
|
||
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
05.08.2019 17:11, Dimitry Sibiryakov пишет: > А лучше всё-таки использовать потоки не внемлет. ибо играет вдохновенно... Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2019, 17:15 |
|
||
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovНадо периодически проверять через GetExitCodeProcess() его состояние Или лучше даже не проверять, а просто ожидать завершения любого из них с помощью WaitForMultipleObjects(). Мимопроходящийне внемлет. Ну, для тех, у кого "расчетные модули" могут внезапно упасть на вторые сутки работы, это может быть необходимым костылём. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2019, 17:22 |
|
||
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичИз основной программы запускаю расчетные модули, расчетные модули считают (нередко долго, часы и дни каждый), по завершении сами закрываются, иногда надо запустить до сотни расчетных модулей, запускать их все - сами понимаете, потому нужно отслеживать сколько их запущено в данный момент и дозапускать по мере закрытия. ИМХО, я бы сделал отдельный поток для управления этими процессами, в который бы засунул семафор для управления потоком и массив хэндлов для процессов, после чего в цикле запускал бы нужное количество процессов и делал WaitForMultiplyObjects(...., INFINITE) для семафора и процессов. Пока процессы работают - он спит и не потребляет ресурсы, когда какой-то процесс завершается мы в цикле перебираем массив вызовом GetExitCodeProcess(), закрываем хэндлы неактивных процессов и перезапускаем их, после чего снова ждём. Если сработал семафор - завершаем поток. По желанию можно при этом принудительно завершить все вторичные процессы. Управлять потоком из гуя - через семафор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2019, 17:23 |
|
||
|
Не корректно работает CreateProcess.
|
|||
|---|---|---|---|
|
#18+
05.08.2019 17:23, alekcvp пишет: > Управлять потоком из гуя - через семафор. гуй не нужен Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2019, 17:25 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39845385&tid=2039166]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
151ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 452ms |

| 0 / 0 |
