Russian Qt Forum

Qt => Общие вопросы => Тема начата: zoro86 от Май 19, 2010, 09:20



Название: как довести до ума updater...
Отправлено: zoro86 от Май 19, 2010, 09:20
Тут у меня стоит задача написание updater - a ...

алгоритм такой:
... имеется терминальная программа для оплаты услуг
... ведется проверка файлов и версии программы на стороне сервера HTTP
... если есть изменения в глобальном hash (size + date + name) всех имеющихся файлов то запускается updater
... он качает Xml:
Код:
...
<file path="/database/" name="terminal_interfaces.xml" size="15220">025a32e9a4d4f42b6333f2928d562134</file>
<file path="/database/" name="terminal_product.xml" size="26287">f2ed5eb1084eb17c12ecef9aabd2cce4</file>
...

... потом идет сравнение с заранее подсчитанными hash локальными файлами...
... если есть изменения то файл начинает качаться...
... итак циклически до последней закачки

То что приведено сверху я уже реализовал и отестировал...

если обновился основной .exe файл терминальной программы я на данный момент качаю его в tmp/ ....
после подтверждения что файл закачался нормально надо его обновить...

Вопрос в следующем...

как проверить и удалить процесс если я знаю имя .exe файла с помощью QProcess?
искал по форуму ничего конкретного не нашел... кто нить помогите...



Название: Re: как довести до ума updater...
Отправлено: nn1317 от Май 19, 2010, 09:46
варианта 2 - получить список процессов с pid и выбрать свой или же заюзать апи-функцию получения Pid по имени бинаря (название не помню, но она есть). как дополнительный вариант - выполнить консольную команду kill в терминале (на винде))


Название: Re: как довести до ума updater...
Отправлено: zoro86 от Май 19, 2010, 10:09
хотелось бы конечно через WinApi но я в этом не шарю...

если кто работал давайте пример...

на счет taskkill я его на данный момент и юзаю.... вроде пока работает... довожу до ума..


Название: Re: как довести до ума updater...
Отправлено: Wlad_C от Май 19, 2010, 15:31
Я удалял Excel следующим образом:

bool GetExcelPid(HWND hExWindow, LPDWORD pPid)
{
        // Получаем PID процесса excel.exe
   if (!hExWindow) return false;
   char ClassName[100];
// Получаем PID нашего процесса
   if (!GetWindowThreadProcessId(hExWindow, pPid)) return false;
// На всякий случай проверяем является ли он действительно Excel, для этого
// проверям класс процесса, он должен быть "XLMAIN" (получено экспериментальным путем)
   if (GetClassName(hExWindow, ClassName, 99) == 0) return false;
   if (CompareStr("XLMAIN", ClassName) != 0) return false;
   return true;
}

bool KillProcess(DWORD PID)
{
        // Функция для закрытия любого процесса по его PID'у
  bool ReturnCode = false;
  HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, false, PID);
  if (hProcess != NULL || hProcess != INVALID_HANDLE_VALUE)
  {
    if (TerminateProcess(hProcess, -1))
      ReturnCode = true;
    CloseHandle( hProcess );
  }
  return ReturnCode;

Попробуй по аналогии.
}


Название: Re: как довести до ума updater...
Отправлено: fuCtor от Май 19, 2010, 20:30
Я так понял что Updater отдельная программа, то можно сделать такой вариант:
посмотреть на реализацию SingleApplication и при необходимости закрытия посылать сообщение.


Название: Re: как довести до ума updater...
Отправлено: zoro86 от Май 20, 2010, 08:24
Тут у меня еще один вопросик возник...

в реализации примера examples\network\downloadmanager имеется ряд недоделок:

там нет функции подкачки....
или хотя бы если если докачка прервалась чтобы он Succeeded не выдавал а отлавливал ошибку...

Код:
QNetworkRequest request(url);
    currentDownload = manager.get(request);
    connect(currentDownload, SIGNAL(downloadProgress(qint64,qint64)),
            SLOT(downloadProgress(qint64,qint64)));
    connect(currentDownload, SIGNAL(finished()),
            SLOT(downloadFinished()));
    connect(currentDownload, SIGNAL(readyRead()),
            SLOT(downloadReadyRead()));

где manager это объект QNetworkAccessManager...

Код:
void DownloadManager::downloadFinished()
{
    progressBar.clear();
    output.close();

    if (currentDownload->error()) {
        // download failed
        fprintf(stderr, "Failed: %s\n", qPrintable(currentDownload->errorString()));
         emit download_error();
    } else {

        printf("Succeeded.\n");
        ++downloadedCount;
       emit download_succes();
    }

    currentDownload->deleteLater();
    startNextDownload();
}

какие будут предложения для решения этой задачи...

может мне проверять размер и по размеру смотреть в слоте докачал или нет или все же есть какой нить другой путь???


Название: Re: как довести до ума updater...
Отправлено: ритт от Май 20, 2010, 09:42
недавно про докачку тема была. мб всё-таки начнём пользоваться поиском?


Название: Re: как довести до ума updater...
Отправлено: Alex Custov от Май 20, 2010, 10:42
недавно про докачку тема была. мб всё-таки начнём пользоваться поиском?

а где? Мне было бы интересно почитать, а поиск по слову "докачка" не выдал именно таких тем.


Название: Re: как довести до ума updater...
Отправлено: zoro86 от Май 20, 2010, 10:57
У меня получилось реализовать когда файл не докачен я его качаю заново...

порылся по форуму но там не доконченная тема http://www.prog.org.ru/topic_13270_0.html (http://www.prog.org.ru/topic_13270_0.html)

надо попробывать , для загрузки больших файлов самый раз..


Название: Re: как довести до ума updater...
Отправлено: crossly от Май 20, 2010, 11:18
тема вполне законченная..... 


Название: Re: как довести до ума updater...
Отправлено: Alex Custov от Май 20, 2010, 17:27
недавно про докачку тема была. мб всё-таки начнём пользоваться поиском?

ох надо что-то делать с поиском. По слову "докачка" вышеназванную тему он не находит, т.к. там слово "докачку". Так же ж половина тем упускается из поиска.


Название: Re: как довести до ума updater...
Отправлено: Alex Custov от Май 20, 2010, 17:32
У меня получилось реализовать когда файл не докачен я его качаю заново...

порылся по форуму но там не доконченная тема http://www.prog.org.ru/topic_13270_0.html (http://www.prog.org.ru/topic_13270_0.html)

надо попробывать , для загрузки больших файлов самый раз..

Когда файл недокачанный, как уже сказали, надо использовать HTTP Range:

Код
C++ (Qt)
QNetworkRequest header(url);
int size = fileSize(); // размер частично загруженного файла
header.setRawHeader(QByteArray("Range"), QString("bytes=%1-").arg(size).toAscii());
 
manager->get(header);
 

В этом случае сервер будет отдавать файл, начиная с "size" байта, а не сначала. Если сервер не поддерживает Range, он отдаст HTTP 416.


Название: Re: как довести до ума updater...
Отправлено: zoro86 от Май 25, 2010, 07:20
то есть не size + 1 отправлять?