2015-06-26 2 views
0

Я использую Qt5 под Windows7.
Я знаю, как создать задачу с помощью QThread, но моя проблема:
Как мне запускать ее каждый день в 03:00?
Я думал о QTimer, но, похоже, это не нормально ... он никак не может быть связан с 03:00.Qt5: Как создать задачу (очистка), которая выполняется один раз в день в 3 часа ночи?

Просто, чтобы сделать это ясно.: Я не могу использовать некоторые приложения (приложения) Windows. Он должен быть закодирован внутри моего приложения Qt, так как он выполняет некоторое задание на очистку: список истории очистки, обрезать его до 1000 строк (или что-то еще) и т. Д. Итак, вы видите, что я не могу этого сделать с помощью TaskScheduler или подобных инструментов Windows. ..

+0

Гарантировано, что приложение действительно работает? –

+0

Это своего рода сервер (TCP comm) и т. Д. Итак, предполагается, что он работает в течение всего дня ... –

+0

Код фрагмента, приведенный выше в качестве примера Kuba Ober, выглядит нормально, НО для его получения скомпилированный один ДОЛЖЕН исправить опечатку: «sheduleCleanup()» изменить его с помощью «scheduleCleanup()». Я не тестировал его, но я не вижу причин, почему это не сработает. Спасибо К.О.! –

ответ

1

вы можете использовать планировщик задач Windows, чтобы сделать это для вас

enter image description here

+0

Согласен. Гораздо лучше, чтобы планировщик периодически запускал приложение, чем он сидел, ожидая до 3 утра. – mike

+0

Спасибо, но это не то, что я есть ищет ... –

0

Если вы можете использовать C++ 11, посмотреть на std::this_thread::sleep_until. Запустите его в отдельном потоке и дайте потоку испустить сигнал, подключенный к слоту в основном потоке, который затем выполняет действие. Это, конечно, требует, чтобы ваше приложение фактически работало в 3 часа ночи.

+0

Это возможность, но тратить поток и, следовательно, около 1 МБ виртуальной памяти, просто так, что вы ничего не можете сделать в течение долгого времени, кажется сумасшедшим. –

1

Неправильно использовать QTimer? Я согласен с тем, что планировщик задач является лучшим вариантом. Здесь выполняется только около 0,03% временного кода, он действительно должен что-то делать. Если точный момент не так важен, вы можете увеличить интервал таймера и контрольные границы и сократить количество лишних вызовов. Но если вы предпочитаете такое решение, это должно сработать:

someclass::someclass(){ 

    member_timer = new QTimer(this); 
    QObject::connect(member_timer, SIGNAL(timeout()), this, SLOT(check_time())); 
    member_timer->start(30000); 

    member_cleanup_performed = false; 
} 

void someclass::check_time(){ 

    QTimer ctime = QTime::currentTime(); 
    if(ctime.hour() == 3 && ctime.minute() == 0){ 

     if(member_cleanup_performed == false){ 
      this->cleanup(); 
      member_cleanup_performed = true; 
     } 
    }else{ 
     member_cleanup_performed = false; 
    } 
} 
+0

QTime class предлагает метод «int \t secsTo (const QTime & t) const ", который, как я думаю, может быть использован для оптимизации вышеприведенного кода. Напротив, я бы сделал это следующим образом :) Было бы очень элегантно, а также избегать проверки откачки каждые 30 секунд. Просто идея :) –

+0

@groenhen Да, я видел это в связанном теперь вопросе. Определенно лучшее решение, но спасибо, что указали это. – Bowdzone

Смежные вопросы