3

Qtで実際的な問題に直面しています。QLocalSocketと別のプロセス(パイプ/ UNIXソケット)と通信するクラスを使用しています。他のイベントが発生する前、つまりapp.exec()が開始する前(より正確には、アプリが開始するとすぐに)にその通信を行う必要があります。 )。私が使用しているクラスにはイベントループが必要なので、イベントループが開始される前にクラスメソッドを呼び出すと機能しません。イベントループの準備ができたときに何かを開始する方法はありますか?非表示のイベント専用ウィンドウを作成し、非表示のウィンドウコンストラクターで職務を遂行し、このウィンドウをトップレベルとして確立することを考えました。

基本的に、このローカルソケット通信タスクは、イベントループが利用可能になったらすぐに開始する必要があります。

何か案は?

ありがとうございました。

4

2 に答える 2

7

QApplication::exec() を呼び出す前に、QEventLoopを使用して別のイベントループを開始できます。クラスから「完了」シグナルを発行し、それを QEventLoop quit() スロットに接続するか、使用している Qt クラスで提供されている既存のシグナルを使用する必要があります。

QNetworkAccessManager を使用して Web ページをフェッチする簡単な例を次に示します。

app = QtCore.QCoreApplication([])
manager = QtNetwork.QNetworkAccessManager()
req = QtNetwork.QNetworkRequest(QtCore.QUrl("http://www.google.com"))
resp = manager.get(req)
eventloop = QtCore.QEventLoop()
eventloop.connect(resp, QtCore.SIGNAL('finished()'), QtCore.SLOT('quit()'))

eventloop.exec_() # this will block until resp emits finished()

print resp.readAll()

app.exec_()

これはあなたのニーズに合っているかもしれませんが、ウィンドウで show() を呼び出す前に、単純に何かを行うことができない理由がよくわかりませんでした。それが完了したら、show() を呼び出します。

于 2009-11-18T08:19:03.547 に答える
2

何よりも先に通信を開始する必要がある場合は、遅延が0msのシングルショットタイマーを使用できます。

QTimer::singleShot(0, commsInstancePtr, SLOT(startCommunication()));

他のすべてを実行する前に実際に操作を終了する必要がある場合は、Danielのソリューションの方が適している可能性があります。

于 2009-11-18T13:38:02.147 に答える