Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Крешь на TerminateProcess  (Прочитано 9715 раз)
0 Пользователей и 1 Гость смотрят эту тему.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« : 29-09-2006 09:27 » 

Есть приложение своеобразный шетдулер который мониторить приборы и по некоторому "сложному" алгоритму стратует задачи.
В том случае если по какйто причине запущеная им задача зависла и не успела завершится к моенту следующего запуска он должен убить ее и запустить заново  для этого вставлен следующий кусок
  
Код:
DAC_Stat d=m_Counts[id];
TRY
{
this->WriteLog (hFileLog,CString(_T("Terminate old DL proc ")) );
TerminateProcess(sRun.hProc ,0);
this->WriteLog (hFileLog,CString(_T("Terminate sucsses ")) );
}CATCH_ALL(pE)
{  
this->WriteLog (hFileLog,CString(_T("Terminate error ")) );
}END_CATCH_ALL;

Приложение  в некий произволный момент оработав произвольное число циклов вылетает, в логе последней строчкой всегда

"Terminate old DL proc "


В чем проблема?



Записан

Да да нет нет все остальное от лукавого.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #1 : 29-09-2006 11:19 » 

ты уверен, что вот это указывает на сторонний процесс, а не на текущий
первое, что в голову пришло
Записан

Странно всё это....
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 29-09-2006 11:38 » 

Отладчиком не смотрел ибо до времени креша прога может работать 3-4 часа, дальше там:

 if( !CreateProcess( NULL, // No module name (use command line).
        b, // Command line.
        NULL,             // Process handle not inheritable.
        NULL,             // Thread handle not inheritable.
        FALSE,            // Set handle inheritance to FALSE.
        0,                // No creation flags.
        NULL,             // Use parent's environment block.
        NULL,             // Use parent's starting directory.
        &si,              // Pointer to STARTUPINFO structure.
        &pi )             // Pointer to PROCESS_INFORMATION structure.
    )
    {
      printf("\n DAC: DL hour not run. [%d-%d-%d %d:%d:%d],[%d] ", d.LTLD.GetYear(),  d.LTLD.GetMonth(),d.LTLD.GetDay(),d.LTLD.GetHour(),d.LTLD.GetMinute(),d.LTLD.GetSecond(),d.id_count_DB);
       sRun.hProc=INVALID_HANDLE_VALUE;
      return 0;
    }
 sRun.hProc =pi.hProcess;


Еще одно время у меня система на одну одна из задач запускаемых этим шетдулером, выдавала сообщение о  дедлоке....   
« Последнее редактирование: 17-12-2007 17:12 от Алексей1153++ » Записан

Да да нет нет все остальное от лукавого.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #3 : 29-09-2006 12:37 » 

а ты убей внешний процесс, что бы условие убийства сработало.
поробуй значение
sRun.hProc
кидать в лог, при установке и перед уничтожением.
вдруг они не совпадают
попробуй ибивать сразу после старта.
Записан

Странно всё это....
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 29-09-2006 12:39 » 

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

Да да нет нет все остальное от лукавого.
Diletant
Помогающий

de
Offline Offline

« Ответ #5 : 29-09-2006 15:19 » 

К моменту удаления Handle уже не соответствует процессу и существует только потому, что ты его не закрыл. Имеет смысл хранить не handle, а PiD и получать хэндл заново с помощью OpenProcess().
Записан
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 02-10-2006 04:01 » 

К моменту удаления Handle уже не соответствует процессу и существует только потому, что ты его не закрыл. Имеет смысл хранить не handle, а PiD и получать хэндл заново с помощью OpenProcess().

Я тоже об этом думал, но предпологал что  TerminateProcess просто обязан коректно обрабатывать такую ситуацию, в противном случае его былобы в принципе нельзя использовать, потому что как не крути ноо всегда есть вероятность что между  OpenProcess() и TerminateProcess процесс завершится сам....
Записан

Да да нет нет все остальное от лукавого.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines