2017-04-24 1 views
-1

を実行していますUSBドライブ。私は私のx86 Linuxデスクトップ上で正常に動作InterfacesAdded from org.freedesktop.UDisks2、を聞くためにQtのD-バスのサポートを使用しています。最善の方法は、</p> <p>私は、ユーザーが挿入したときに通知する必要ラズベリーパイのためのプログラムを書いています(この質問は異なるstackexchangeサイト上のほうであれば私の謝罪)

はここに私のクラスのスロットにD-バス信号を設定します私のコードです:

auto bus = QDBusConnection::systemBus(); 
auto monitor = new UsbMonitor(&app); // my class 

if (!bus.connect("org.freedesktop.UDisks2", "/org/freedesktop/UDisks2", "org.freedesktop.DBus.ObjectManager", "InterfacesAdded", 
      monitor, SLOT(handleit(QDBusObjectPath, QMap<QString,QVariant>)))) { 
    qFatal("FATAL Couldn't connect USB monitor to D-Bus signal"); 
} 

それはパイでは動作しません。 udisksdが必要なときに自動的に起動するはずですが、udisksdが実行されていないという事実まで追跡しました。

私は(ないGUI)をコンソールに起動すると、それだけでは、D-バスを持っているだけでは不十分だと、シグナルハンドラを追加しているので、自動的にudisksd始めることを推測しています。

私はbus.connectその後、すべての作品に私の呼び出しの前に

auto msg = QDBusMessage::createMethodCall("org.freedesktop.UDisks2", "/org/freedesktop/UDisks2", "org.freedesktop.DBus.ObjectManager", "GetManagedObjects"); 
bus.call(msg); 

を追加した場合。

確認udisksdが実行されているようにする良い方法はありますか?私はむしろPi上の設定ファイルを変更するだけで、サービスを "起動"するために余分なコードを持たなければなりません。

答えて

1

はあなたのパイで実行されているものを配布依存します。 systemdを使用するディストリビューションを使用している場合は、sudo systemctl enable --now udisks2.serviceを実行して、サービスを常に開始するように設定できます。

信号が消えて再び現れるときに信号を再接続したい場合があるので、D-Busのorg.freedesktop.UDisks2の名前を見るようにコードを拡張することができます。 (私はQtのD-バスがこれをどのように処理するかを正確に知っていない、それはシグナルハンドラ登録時に一意の名前によく知られた名前を解決し、または信号発光時間にするかどうか。)このような単純な解決策のおかげで

+0

だそれ!私は、udisks2が通常のsystemdサービスファイルとして書かれていることを認識しませんでした。それは[「静的」](https://bbs.archlinux.org/viewtopic.php?id=147964)サービスだから、それは通常のサービスの場合と同じようしかし、 'systemctl enable'コマンドが動作しません。だから、私自身のアプリはsystemdサービスとして開始されているので、udisks2に依存するようにすることができます。 –

関連する問題

 関連する問題