Qt shutdown () не работает на развернутых приложениях

Я сделал программу, которая выключит компьютер через определенное время.
Пользователь вводит время, используя 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 или что-то?

0

Решение

Простое решение — переименовать развернутый exe-файл в нечто вроде: закрыть.Exe или что-нибудь вместо неисправность.Отлично, тогда система выполнит это неисправность команда вместо выполнения вашего приложения снова.

Л.Э .: Могут быть и другие способы решения этой проблемы, но я не исследовал это … так что не забывайте и о других решениях;)

2

Другие решения

Использование 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

Редактировать: Вам также нужна правильная привилегия:

Как выключить компьютер через Windows API?

0

По вопросам рекламы [email protected]