Я сделал программу, которая выключит компьютер через определенное время.
Пользователь вводит время, используя 2 спин-бокса (один для часов, а другой для минут),
затем я конвертирую его в миллисекунды:
ms = (ui->hBox->text().toInt() * 3600 + ui->mBox->text().toInt() * 60) * 1000;
тогда он вызывает функцию timer ()
void Dialog::timer()
{
QTimer *time = new QTimer(this);
time->setInterval(ms);
time->setSingleShot(1);
connect(time, SIGNAL(timeout()), this, SLOT(shutdown()));
time->start();
}
затем сигнал timeout () вызывает слот / функцию shutdown (), которая проверяет, хочет ли пользователь выключить, перезагружать компьютер или выходить из него, а затем выполняет соответствующую команду.
void Dialog::shutdown()
{
if(ui->radioButton->isChecked())
system("shutdown -s -t 0");
else if(ui->radioButton_2->isChecked())
system("shutdown -r -t 0");
else if(ui->radioButton_3->isChecked())
system("shutdown -l -t 0");
}
(также пробовал «shutdown -s -f», и даже только «shutdown -s», кажется, ничто не помогает решить проблему)
Я хочу запустить это приложение только на моем ПК с Windows, поэтому использование system () также не является проблемой.
Приведенное выше приложение прекрасно работает, когда я запускаю его из Qt Creator, но когда я его развертываю, помещаю все необходимые DLL-файлы, программа ждет таймера, а затем просто открывает пустую консоль и затем запускает новый экземпляр программы, компьютер никогда не выключается или перезапустить.
Так что я делаю не так? Я скучаю по некоторым файлам .dll или что-то?
Простое решение — переименовать развернутый exe-файл в нечто вроде: закрыть.Exe или что-нибудь вместо неисправность.Отлично, тогда система выполнит это неисправность команда вместо выполнения вашего приложения снова.
Л.Э .: Могут быть и другие способы решения этой проблемы, но я не исследовал это … так что не забывайте и о других решениях;)
Использование system () небезопасно. Гораздо лучшим решением вашей проблемы является использование вызова Win32 API ExitWindowEx ().
http://msdn.microsoft.com/en-us/library/windows/desktop/aa376868(v=vs.85).aspx
Конечно, поскольку это только окна, вы должны #ifdef для платформы Windows.
#ifdef Q_OS_WIN
#include "qt_windows.h"if ( !ExitWindowsEx(EWX_SHUTDOWN,0)) // Or EWX_FORCE
{
// Failed, call GetLastError() to know why
}
#endif
Редактировать: Вам также нужна правильная привилегия: