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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: как довести до ума updater...  (Прочитано 6188 раз)
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?
искал по форуму ничего конкретного не нашел... кто нить помогите...

Записан
nn1317
Гость
« Ответ #1 : Май 19, 2010, 09:46 »

варианта 2 - получить список процессов с pid и выбрать свой или же заюзать апи-функцию получения Pid по имени бинаря (название не помню, но она есть). как дополнительный вариант - выполнить консольную команду kill в терминале (на винде))
Записан
zoro86
Гость
« Ответ #2 : Май 19, 2010, 10:09 »

хотелось бы конечно через WinApi но я в этом не шарю...

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

на счет taskkill я его на данный момент и юзаю.... вроде пока работает... довожу до ума..
Записан
Wlad_C
Гость
« Ответ #3 : Май 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;

Попробуй по аналогии.
}
Записан
fuCtor
Гость
« Ответ #4 : Май 19, 2010, 20:30 »

Я так понял что Updater отдельная программа, то можно сделать такой вариант:
посмотреть на реализацию SingleApplication и при необходимости закрытия посылать сообщение.
Записан
zoro86
Гость
« Ответ #5 : Май 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();
}

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

может мне проверять размер и по размеру смотреть в слоте докачал или нет или все же есть какой нить другой путь???
Записан
ритт
Гость
« Ответ #6 : Май 20, 2010, 09:42 »

недавно про докачку тема была. мб всё-таки начнём пользоваться поиском?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #7 : Май 20, 2010, 10:42 »

недавно про докачку тема была. мб всё-таки начнём пользоваться поиском?

а где? Мне было бы интересно почитать, а поиск по слову "докачка" не выдал именно таких тем.
Записан
zoro86
Гость
« Ответ #8 : Май 20, 2010, 10:57 »

У меня получилось реализовать когда файл не докачен я его качаю заново...

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

надо попробывать , для загрузки больших файлов самый раз..
Записан
crossly
Гость
« Ответ #9 : Май 20, 2010, 11:18 »

тема вполне законченная..... 
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #10 : Май 20, 2010, 17:27 »

недавно про докачку тема была. мб всё-таки начнём пользоваться поиском?

ох надо что-то делать с поиском. По слову "докачка" вышеназванную тему он не находит, т.к. там слово "докачку". Так же ж половина тем упускается из поиска.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #11 : Май 20, 2010, 17:32 »

У меня получилось реализовать когда файл не докачен я его качаю заново...

порылся по форуму но там не доконченная тема 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.
« Последнее редактирование: Май 21, 2010, 19:10 от Alex Custov » Записан
zoro86
Гость
« Ответ #12 : Май 25, 2010, 07:20 »

то есть не size + 1 отправлять?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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