Russian Qt Forum
Ноябрь 23, 2024, 11:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QProcess startDetached - непонятка  (Прочитано 6034 раз)
CMorgan
Гость
« : Январь 29, 2012, 13:33 »

Добрый день. Пишу апдейтер для прог. Класс апдейтера встраивается в необходимое приложение (к примеру, назовем его test.exe), проверяет есть ли для этого приложения апдейты, если есть - скачивает их, запускает отдельную программу "updater.exe" (занимающиеся распихиванием скаченных файлов по нужным путям и запуском необходимых программ) параллельно грохая родительское приложение  test.exe.
В конце процедуры апдейта возникает необходимость из файла update.exe перезаписать тот файл, который собственно и запускался в начале (test.exe) и запустить его (уже обновленный). И вот тут возникла некоторая непонятка.

код запуска updater.exe из приложения test.exe выглядит так:
Код:
bool  dbUpdater::runupdater()
{
 
QString Dest=_updater_filename; //"Updater.exe"

QProcess file_run;
if(file_run.startDetached (Dest))
{
//все намано, апдейтер запущен грохаем родительский процесс
exit(0);
}

//Что-то пошло не так
return false;

}


В свою очередь в updater.exe
Есть функция проверки, на случай если нам надо перезаписать процесс который еще занят кем-либо:
Код:
bool IsProcessRun( QString processName )
{
BOOL rProcessFound;
PROCESSENTRY32 uProcess;
HANDLE lSnapshot,myproc;
DWORD dwError;

register BOOL term;
lSnapshot=CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS,0);
uProcess.dwSize=sizeof(uProcess);
rProcessFound=Process32First(lSnapshot,&uProcess);
while(rProcessFound)
{
if(strcmp(uProcess.szExeFile,processName.toAscii().data())==0)
{
myproc=OpenProcess(SYNCHRONIZE, FALSE, uProcess.th32ProcessID);
if( myproc!=NULL ) {
WaitForSingleObject(myproc, INFINITE);
CloseHandle (myproc);
CloseHandle(lSnapshot);
return true;
}
}

rProcessFound=Process32Next(lSnapshot,&uProcess);

}

CloseHandle(lSnapshot);
return false;


}

И собственно функция перезаписи:
Код:
bool File_util::f_instal(QString filePath, QString fileName)
{
QString Dest;
QDir targetDir(filePath);
QFileInfo Dest_file_info(fileName);

if(!targetDir.exists(filePath)){
targetDir.mkpath ( filePath );
}

Dest=filePath+Dest_file_info.fileName();

int i=0; int j=0;

if(QFile::exists(Dest))
{
IsProcessRun(Dest_file_info.fileName());//:Ждем пока процесс не освободится

                QFile::remove(Dest); //[b]Так не работает, хотя IsProcessRun честно ожидает пока процесс не освободится[/b]


// while(!QFile::remove(Dest)) //[b]Так срабатывает проходя цикл 2-3 раза.[/b]
// {
// Sleep(1);
// }


}
return QFile::copy (fileName,Dest);



}

Вопрос: что я делаю не так? Что без этого цикла:
Код:
 		while(!QFile::remove(Dest)) //[b]Так срабатывает проходя цикл 2-3 раза.[/b]
  {
  Sleep(1);
  }
У меня не пашет перезапись того файла (test.exe), который вызывает (updater.exe)?

Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Январь 29, 2012, 18:59 »

Код:
IsProcessRun(Dest_file_info.fileName());//:Ждем пока процесс не освободится

                QFile::remove(Dest); //[b]Так не работает, хотя IsProcessRun честно ожидает пока процесс не освободится
Ничего она не ждёт. Она возвращает есть такой процесс или нет.
Записан
CMorgan
Гость
« Ответ #2 : Январь 29, 2012, 21:19 »

Ничего она не ждёт. Она возвращает есть такой процесс или нет.

Там в IsProcessRun

есть строчка:
WaitForSingleObject(myproc, INFINITE); - если она этот процесс в запущенных нашла будет ждать пока он не убьется.

Мож она конечно на открытие  с флагом SYNCHRONIZE тож требует  SeDebugPrivilege и возвращает NULL при выполнении не из под студии, но первоначально я ее не вставлял и просто прогонял функцию на наличие этого процесса в цикле - пока не вернет false.
Получалось цикл срабатывал 80-150 раз возвращал наконец false, после чего я пытался делать  QFile::remove(Dest); и получал такой же отлуп. Т.е. без Sleep она упорно не хочет грохать первый процесс.

 
Записан
CMorgan
Гость
« Ответ #3 : Февраль 14, 2012, 11:55 »

Что-то вспомнил про этот пост.

Если кто-то вдруг столкнется с похожим поведением,
посмотрите нет ли на вашей системе антивиря Касперского  Смеющийся
Именно он держит Хэндл на запущенный процесс, и продолжает его держать некоторое время после того как  процесс уже усе.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 22.