| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- #include "updaterthread.h"
- #include "qapplication.h"
- #include "qdir.h"
- #include <QEventLoop>
- #include <QNetworkAccessManager>
- #include <QNetworkReply>
- #include <QProcess>
- #include <QElapsedTimer>
- bool isNetworkAvailable()
- {
- QNetworkAccessManager manager;
- QEventLoop loop;
- // 进行一个简单的GET请求
- QNetworkReply *reply = manager.get(QNetworkRequest(QUrl("http://ver.stem993.cn/ping")));
- // 等待直到请求完成
- QObject::connect(reply, &QNetworkReply::finished, [&]() { loop.quit(); });
- loop.exec(); // 事件循环
- // 检查请求是否成功
- bool success = reply->error() == QNetworkReply::NoError;
- QString response = reply->readAll();
- reply->deleteLater(); // 清理
- return success && response == "OK";
- }
- bool runUpdate()
- {
- const QString app_version = qApp->applicationVersion();
- const QString pid = QString::number(qApp->applicationPid());
- QStringList arg;
- arg << app_version << pid << "http://ver.stem993.cn/api/v1/sys/ver/check_for_update";
- arg << qApp->applicationFilePath();
- const QString program = qApp->applicationDirPath() + "/../updater.exe";
- bool isrun = QProcess::startDetached(program, arg);
- if (isrun == false) {
- // 这里主要是为了 收集错误信息 运行肯定是运行不了的
- QProcess process;
- process.start(program, arg);
- if (!process.waitForStarted()) {
- qDebug() << "Error: Process failed to start.";
- qDebug() << "Error String:" << process.errorString();
- return false;
- }
- // 如果需要,可以连接信号以获取标准输出和标准错误
- QObject::connect(&process, &QProcess::readyReadStandardOutput, [&]() {
- qDebug() << "Output:" << process.readAllStandardOutput();
- });
- QObject::connect(&process, &QProcess::readyReadStandardError, [&]() {
- qDebug() << "Error:" << process.readAllStandardError();
- });
- // 等待进程结束
- process.waitForFinished();
- }
- return isrun;
- }
- UpdaterThread::UpdaterThread(QObject *parent)
- : QThread(parent)
- {}
- void UpdaterThread::run()
- {
- // 首先执行一次
- if (isNetworkAvailable()) {
- if (runUpdate()) {
- }
- }
- QElapsedTimer timer; // 创建高精度计时器
- timer.start(); // 启动计时器
- while (true) {
- // 校验网络
- if (timer.elapsed() >= 3600000) { // 检查是否经过1小时(3600000毫秒)
- timer.restart(); // 重新启动计时器
- if (isNetworkAvailable()) {
- if (runUpdate()) {
- }
- }
- }
- msleep(1000); // 休息1秒
- }
- }
|