「Qtの基礎 - シャットダウン」の版間の差分

ナビゲーションに移動 検索に移動
215行目: 215行目:
<br><br>
<br><br>


== サスペンド(スリープ) ==
== スリープ ==
* プロセスを直接起動する場合
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
#include <QProcess>
#include <QDebug>
  void Converter::suspend()
  void Converter::suspend()
  {
  {
     bool gnome_power1 = false;
     auto trySuspendCommand = [](const QString &command, const QStringList &arguments) {
    bool gnome_power2 = false;
      QProcess process;
    bool hal_works = false;
      process.start(command, arguments);
     QDBusMessage response;
      process.waitForFinished(5000); // 5秒待機
      return process.exitCode() == 0;
     };
   
   
     gnome_power1 = QProcess::startDetached("gnome-power-cmd.sh suspend");
     // Systemctlを使用してサスペンドを試行
     gnome_power2 = QProcess::startDetached("gnome-power-cmd suspend");
    if (trySuspendCommand("systemctl", QStringList() << "suspend")) {
        qInfo() << "Systemctl経由でサスペンド";
        return;
     }
    qWarning() << "Systemctl経由でのサスペンドに失敗";
   
   
     if(!gnome_power1 && !gnome_power2 && verbose)
     // pm-suspendを使用してサスペンドを試行 (古いLinuxシステム向け)
     {
     if (trySuspendCommand("pm-suspend", QStringList())) {
       qWarning() << "W: gnome-power-cmd and gnome-power-cmd.sh didn't work";
       qInfo() << "pm-suspend経由でサスペンド";
      return;
     }
     }
    qWarning() << "pm-suspend経由でのサスペンドに失敗";
}
</syntaxhighlight>
<br>
* D-Busを使用する場合
<syntaxhighlight lang="c++">
#include <QDBus>
#include <QDebug>
   
   
     if(!gnome_power1 && !gnome_power2)
void Converter::suspend()
    {
{
      QDBusInterface powermanagement("org.freedesktop.Hal", "/org/freedesktop/Hal/devices/computer",
     auto tryDBusCall = [](const QString &service, const QString &path, const QString &interface, const QString &method) {
                                      "org.freedesktop.Hal.Device.SystemPowerManagement", QDBusConnection::systemBus());
        QDBusInterface dbusInterface(service, path, interface, QDBusConnection::systemBus());
      response = powermanagement.call("Suspend", 0);
        QDBusReply<void> reply = dbusInterface.call(method);
   
   
      if(response.type() == QDBusMessage::ErrorMessage)
        return reply.isValid();
      {
    };
          if(verbose)
          {
    // Systemdを試行
            qWarning() << "W: " << response.errorName() << ":" << response.errorMessage();
    if (tryDBusCall("org.freedesktop.login1",
          }
                    "/org/freedesktop/login1",
       }
                    "org.freedesktop.login1.Manager",
      else
                    "Suspend")) {
      {
      qInfo() << "システムはsystemd経由でサスペンドされました";
          hal_works = true;
       return;
      }
     }
     }
    qWarning() << "Systemd経由でのサスペンドに失敗";
   
   
     if(!hal_works && !gnome_power1 && !gnome_power2)
    // Systemdが失敗した場合、GNOMEのセッションマネージャを試行
    {
     if (tryDBusCall("org.gnome.SessionManager",  
      QDBusInterface powermanagement("org.freedesktop.DeviceKit.Power", "/org/freedesktop/DeviceKit/Power",
                    "/org/gnome/SessionManager",  
                                      "org.freedesktop.DeviceKit.Power", QDBusConnection::systemBus());
                    "org.gnome.SessionManager",  
       response = powermanagement.call("Suspend");
                    "Suspend")) {
      qInfo() << "GNOMEセッションマネージャ経由でサスペンド";
       return;
    }
    qWarning() << "GNOMEセッションマネージャ経由でのサスペンドに失敗";
   
   
      if(response.type() == QDBusMessage::ErrorMessage)
    // UPowerインターフェースを試行
      {
    if (tryDBusCall("org.freedesktop.UPower",
          if(verbose)
                    "/org/freedesktop/UPower",
          {
                    "org.freedesktop.UPower",
            qWarning() << "W: " << response.errorName() << ":" << response.errorMessage();
                    "Suspend")) {
          }
      qInfo() << "UPower経由でサスペンド";
       }
       return;
     }
     }
    qWarning() << "UPower経由でのサスペンドに失敗";
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>

案内メニュー