Имя: Пароль:
IT
 
Запуск процессов в Delphi (решено)
,
0 Kseniya_
 
25.06.15
22:46
У меня такая проблема. Есть 4 программы, которые должны работать непрерывно, кроме основного результата своей работы, они пишут логи в файлы с текущим днем, все по одному принципу.
Есть программа, которая должна отслеживать каждую минуту, запущены ли все остальные программы, и запускать их. Эта программа работает и тоже пишет логи в файлы, что она запустила. Она получает список процессов, проверяет, есть ли там нужный процесс, и запускает программы. Все это работает, но мной замечено, что в логи программы, запускающей четыре программы, после запуска тех других программ, начинают писаться логи программы 1, 2, 3 и 4, которые никак не связаны с этой папкой, так же, к примеру, в этой папке создаются файлы и папки, которые должны создаться при отсутствии теми другими программами. Будто эти программы запустились внутри не своей папки.
Программы я запускаю так (пробовала оба способа):
WinExec(PChar(Path1), SW_SHOWNORMAL);
или
ShellExecute(Handle, 'open', PChar(Path1), nil, nil, SW_SHOWNORMAL);
Кто-нибудь сталкивался с такой проблемой?
1 Zamestas
 
25.06.15
22:55
(0) Попытка
   Телепат.Подключить();
...
Телепат успешно подключен.
Проблема возникает только у тех процессов (которых 4шт.) которые перезапустил контролирующий процесс?
2 MMF
 
25.06.15
22:56
ну практически каждый 1С ник сталкивался с таким потоком чистого сознания от бухш.
Если включить телепатию, то в этой мегасистеме при определении имени файла лога нет привязки к каталогу экзешника, а тупо к текущей директории, которую изменяет прога-надзиратель.
Самое правильное - ctrl+a shift+delete, но можно и подрихтовать
LogFileName := ExtractFilePath(Application.ExeName) + 'Log.txt'
3 Kseniya_
 
25.06.15
23:09
Спасибо! Да, у тех программ прописан краткий путь. Можно все те программы доработать, чтобы все пути были полными. Или во избежание риска у меня появилась идея программно создать и запустить bat-файл в папке с теми программами для их запуска. Получается я из чужой папки запущу только батник, который заранее сохраню в других папках. И каждую программу запущу только из её папки батником.
4 Garykom
 
гуру
25.06.15
23:15
(3) если батник то простое решение cd c:\...
5 MMF
 
25.06.15
23:17
(3) идея, конечно, мощная. Но она ничего не изменит :-)
(4) это еще хуже, потому как все логи начнут писаться в корень в опять же один файл (это если прав у прог хватит)
6 Garykom
 
гуру
25.06.15
23:20
(5) счего? как я понял путь до лога проги берут при запуске по текущему каталогу

если их запускать поочередно меняя тек.каталог на нужный то они будут в свои каталоги писать
7 Kseniya_
 
25.06.15
23:21
Если исправить проблему с логами и папками полным путем, я просто боюсь, что это этим не закончится, вдруг другие проблемы в работе программ будут того, что меняется директория.
8 H A D G E H O G s
 
25.06.15
23:21
"Delphi разработчик"

Хех.
9 H A D G E H O G s
 
25.06.15
23:25
ShellExecute(Handle, 'open', PChar(Path1), nil, PChar(ExtractFileDir(Path1)), SW_SHOWNORMAL);
10 H A D G E H O G s
 
25.06.15
23:27
ShellExecute не рекомендуется пользовать часто на мелкие процессы.
Лучше CreateProcess()

http://www.gunsmoker.ru/2015/01/avoid-using-ShellExecuteEx.html
11 Garykom
 
гуру
25.06.15
23:31
(8) это не мне случайно?
как бы не озвучен способ получения/сохранения полного имени файла лога внутри программ

может там берется текущий путь + имя файла лога при запуске, пишется в переменную и дальше юзается переменная?

что каждый раз append переоткрываются логи при записи каждой строки это то понятно
12 H A D G E H O G s
 
25.06.15
23:32
Всем погроммистам рекомендую к чтению блог GunSmoker-а.
Вы его просто будете читать.
Потом будете вспоминать, что где -то об этом читали.
Потом с радостью находить заново.
Потом будете делать закладки.

http://www.gunsmoker.ru/2011/04/windows-spin-off.html
13 MMF
 
25.06.15
23:34
(6) оооо, убивец ТВ :-)
ну ок, тестируем:
создаем мега приложение, кидаем на форму надпись и таймер с обработчиком
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  label1.Caption := GetCurrentDir;
end;
создаем два каталога "1" и "2" и ложим в каждый по экземпляру экзешника
создаем батник:
cd d:\1
start project1.exe
cd d:\2
start project1.exe
наблюдаем, ясен пень, две формы с одинаковым каталогом
14 Garykom
 
гуру
25.06.15
23:35
(13) пипец еще один (( см (11)
15 Kseniya_
 
25.06.15
23:37
(9) Большое Вам Спасибо! Поняла, неправильно указала параметры функции при запуске, сейчас указала директорию, запустила и все стало работать корректно! Вопрос закрыт.
16 H A D G E H O G s
 
25.06.15
23:37
женщины.
17 Garykom
 
гуру
25.06.15
23:38
(15) скажи если Вы ручками по отдельности свои 4 проги запускаете по очереди... они правильно логи пишут в свои папки?
18 Garykom
 
гуру
25.06.15
23:39
(17)+ в смысле по очереди, заходя в папку каждой, все запустить, одновременно чтобы работали, пишут в один файл тоже?
19 H A D G E H O G s
 
25.06.15
23:39
(17) а ты упорный.

Думаю, тебе по силам убивец ТВ.
20 Garykom
 
гуру
25.06.15
23:39
А то у нас тут маленький спор по телепатическим модулям...
21 Zamestas
 
25.06.15
23:42
Переменные окружения процесса родителя передаются всем его потомкам, в т.ч. и текущая директория.
22 Kseniya_
 
25.06.15
23:42
(17) Если сама запускаю, то логи пишут в папку, в которой находится исполняемый файл. Тут можно оставить без полного пути.
23 Garykom
 
гуру
25.06.15
23:48
(21) дык про bat-ник и cd был спор, по (4) и (8)
24 Zamestas
 
25.06.15
23:54
(23) И я о чем - см.(1):
Батником стартуем 4 процесса пусть так
c:\proc1\start.exe
c:\proc2\start.exe
c:\proc3\start.exe
c:\proc4\start.exe
и до кучи контрольный процесс:
c:\control\start.exe
в результате работы отлетает c:\proc2\start.exe
и c:\control\start.exe его перезапускает со своими переменными окруждения, т.е. для c:\proc2\start.exe текущая директория c:\control в которую он и будет валить логи.
25 Garykom
 
гуру
26.06.15
00:08
(24) а теперь просто добавь... cd ... между... нужные...
26 Zamestas
 
26.06.15
00:14
(25) Подробнее можно?
27 romix
 
26.06.15
00:37
(0) Надо посмотреть как дочерние проги ищут свою рабочую папку. Проще всего, если она им передается как параметр командной строки.

ЕМНИП есть еще варианты с передачей папки через параметры Windows.

Для полной ясности можно писать больше логов, а если кодом дочерней проги не управляете, то написать вместо нее  отладочную программу-пустышку, которая куда-нибудь пишет поступающие ей извне данные.
28 Kseniya_
 
26.06.15
00:45
(27) Всеми кодами управляю, видела, что пути прописаны краткие, 'logs/...', Почему текущая директория программ менялась на ту, откуда запускалась уже разобралась, по совету (9) указала путь к папке и все уже хорошо работает. А ранее путь к папке программы указан не был в параметре функции, что, видимо, и сломало логику работы. Сейчас проблема уже решена.
29 Garykom
 
гуру
26.06.15
00:47
(28) лучше скажи где работаем ;) или для чего оно (учеба)?
30 Garykom
 
гуру
26.06.15
00:48
(29)+ в смысле интересно же кто это есчо (в какой конторе) Delphi применяет и зачем? да еще и в родном городе...
31 Zamestas
 
26.06.15
00:51
(30) Будете длинными зимними вечерами что нить компилить ? )))
32 Kseniya_
 
26.06.15
00:54
(30) Для работы, естественно. Не хочу рассказывать в интернете. Скажем так, эти программы ходят в море.
33 Zamestas
 
26.06.15
00:58
(32) И что они там делают (если не секрет)?
34 Garykom
 
гуру
26.06.15
00:58
(32) понял, думаю даже общие знакомые есть
35 MMF
 
26.06.15
00:59
(33) топят корабли... ну так, иногда.. когда каталоги принимают неверные значения
36 Zamestas
 
26.06.15
01:03
(35) Не пали контору - про коста конкордию знаю, морем плавать и так боюсь.
37 ЧеловекДуши
 
26.06.15
06:51
(0) Много буковок, мало запятых. Текст не читабелен, особенно утром.
....Код автор не показывает, как он чего отслеживает.. :)


...
Я бы порекомендовал создать службу которая в свою очередь запустит 4-ре программки и будет их отслеживать под "ИД" (не помню уже как там оно у форточек). И собственно все :)
38 ЧеловекДуши
 
26.06.15
06:51
(24) Батник, удел Админа незнающего Делфи :)
Независимо от того, куда вы едете — это в гору и против ветра!