実行中にコンピュータの電源を入れたり切ったりして、コンピュータがスリープ状態にならないようにする方法が必要です。
私は信じるスレッド実行状態の設定Windowsでこれを行いましたが、Linuxで実行できる方法を探しています。
答え1
Linuxでのみ動作します。残念ながら、これがUnixシステムでどのように機能するのかわかりません。
使用する必要があります全身阻害剤この目的のために(非システムディストリビューションでelogindが提供するサプレッサロックを使用することもできます)、これはDBus APIを使用して制御できるため、Qtを使用している場合はQDBusモジュールを使用できます(他のDBusライブラリも使用できます)。 C / C ++にはシステムインヒビターを処理するための特定のライブラリがないようです。
答え2
いくつかのC++ラッパーがあります。
https://github.com/martinhaefner/simpll
https://github.com/makercrew/dbus-sample
http://dbus-cplusplus.sourceforge.net/
とDBusBindinghttps://www.freedesktop.org/wiki/Software/DBusBindings/
私はQtを使用しており、以下は私が使用しているコードです。このコードは修正版です。この回答
void MainWindow::toggleSleepPevention()
{
#ifdef Q_OS_LINUX
const int MAX_SERVICES = 2;
QDBusConnection bus = QDBusConnection::sessionBus();
if(bus.isConnected())
{
QString services[MAX_SERVICES] =
{
"org.freedesktop.ScreenSaver",
"org.gnome.SessionManager"
};
QString paths[MAX_SERVICES] =
{
"/org/freedesktop/ScreenSaver",
"/org/gnome/SessionManager"
};
static uint cookies[2];
for(int i = 0; i < MAX_SERVICES ; i++)
{
QDBusInterface screenSaverInterface( services[i], paths[i],services[i], bus);
if (!screenSaverInterface.isValid())
continue;
QDBusReply<uint> reply;
if(preferences.preventSleep == true)
{
reply = screenSaverInterface.call("Inhibit", "nzuri-video Downloader", "REASON");
}
else
{
reply = screenSaverInterface.call("UnInhibit", cookies[i]);
}
if (reply.isValid())
{
cookies[i] = reply.value();
// qDebug()<<"succesful: " << reply;
}
else
{
// QDBusError error =reply.error();
// qDebug()<<error.message()<<error.name();
}
}
}
#elif defined Q_OS_WIN
EXECUTION_STATE result;
if(preferences.preventSleep == true)
result = SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED);
else
result = SetThreadExecutionState(ES_CONTINUOUS);
if(result == NULL)
qDebug() << "EXECUTION_STATE failed";
#endif
}