Как я могу уменьшить использование процессора моим приложением? - PullRequest
0 голосов
/ 30 августа 2018

Мое приложение включает резервное копирование определенной базы данных sqlite, установленной пользователем. Эта резервная копия основана на определенных условиях. Поэтому, чтобы сделать это, я использую рабочий объект (работающий на QThread), проверьте, соответствуют ли условия. Если условие соответствует, я беру резервную копию. Моя проблема в том, что я проверил диспетчер задач, и мое приложение всегда использует минимум 25% (так как поток работает). Если я отключу автоматическое резервное копирование, он вернется к нормальной жизни. Я делаю что-то не так или это нормально? Может кто-нибудь указать мне, как сохранить низкое использование процессора? Ниже мой код для автоматического резервного копирования потока.

void Automatic_Backup_Logic::Thread_Run()
{
    QSettings settings(ORGANISATION, APPLICATION_NAME);
    while(!m_Stop){
        // First check the backup type
        int backup_type = settings.value(BACKUP_TYPE).toInt();
        QTime BackupTime = qvariant_cast<QTime>(settings.value(BACKUP_TIME));

        // Check for backup time; if it's in range only then do backup
        if(!Check_Backup_Time(BackupTime)){
            continue;
        }

        switch (backup_type)
        {
            case BACKUP_TYPE_MANUAL:
            // do nothing here
                continue;

            case BACKUP_TYPE_DAILY:
                Backup_Daily();
                break;

            case BACKUP_TYPE_WEEKLY:
                Backup_Weekly();
                break;

            case BACKUP_TYPE_MONTHLY:
                Backup_Monthly();
                break;

            case BACKUP_TYPE_YEARLY:
                Backup_Yearly();
                break;

            default:
                break;
        }

        // Wait for the current backup minute to pass by to avoid multiple copies
        QTime t1 = qvariant_cast<QTime> (settings.value(BACKUP_TIME));
        while(t1.minute()==QTime::currentTime().minute()){
            if(m_Stop)
                return;
            QCoreApplication::processEvents();
        }
    }
}

PS: я запускаю этот поток по стандартной процедуре Qt, которая создает рабочий поток и использует функцию moveToThread ()

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Чистый подход к этой проблеме - использовать механизм сигнала / слота Qt.

Просто настройте QTimer с оставшимся временем для резервного копирования и подключите его сигнал timeout() с резервным слотом, например:

class Automatic_Backup_Logic {
public:
    Automatic_Backup_Logic() {
        connect(&mBackupTimer, &QTimer::timeout, this, &Automatic_Backup_Logic::performBackup);
    }

    void scheduleBackup(QTime backupTime) {
        int millisRemaining = getTimeRemaining(backupTime);
        mBackupTimer.singleShot(millisRemaining);
    }

private slots:
    void performBackup() {
    }

private:
    QTimer mBackupTimer;
}
0 голосов
/ 30 августа 2018

Как предложено в комментариях, я добавил задержку в свою ветку, теперь все работает как положено. Спасибо всем

Отредактированный код

    // Check for backup time; if it's in range only then do backup
    while(!Check_Backup_Time(BackupTime) && !m_Stop){
        QThread::sleep(1);
        BackupTime = qvariant_cast<QTime>(settings.value(BACKUP_TIME));
    }
...