我需要一种方法来防止计算机休眠,在运行时打开/关闭它。
我相信设置线程执行状态在 Windows 上做到了这一点,现在我正在寻找一种在 Linux 上做到这一点的方法。
答案1
仅适用于 Linux,不幸的是我不知道这在 Unix 系统上如何工作:
你应该使用系统抑制剂为此(在非 systemd 发行版上也可以使用由 elogind 提供的抑制器锁)。这些可以使用 DBus API 进行控制,因此如果您使用 Qt,您可以使用 QDBus 模块(其他 DBus 库也可用,我不认为 C/C++ 有一个特定的库用于处理 systemd 抑制剂, DBus API 很简单并且与语言无关)。
答案2
有一些 C++ 包装器:
https://github.com/martinhaefner/simpll
https://github.com/makercrew/dbus-sample
http://dbus-cplusplus.sourceforge.net/
和 DBusBindingshttps://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
}