2012-03-16 24 views
9

stdinからQtで非同期に読み込みたいと思います。別のスレッドを使用したり、タイマーをセットアップしてファイルディスクリプタにデータがあるかどうか定期的にチェックしたりする必要はありません。これどうやってするの?Qtでstdinから非同期に読み込む

+0

スレッドまたはポーリングを使用すると何が問題になりますか? – Chris

+0

余分なスレッドでリソースを無駄にしたくなく、私がそれを避けることができない場合はロックを処理する必要があります。私はまた、私のアプリがアイドルであるときにCPUサイクルを無駄にしたくありません。 – megazord

+2

実際に必要があるかどうかを見る前に、コードを最適化しようとしているような気がします。私は、スレッドのアプローチはおそらくあまりにも複雑だと思いますが、タイマーを定期的にポーリングするのはかなり安いです。 – Chris

答えて

3

Qtのドキュメントを読むと、ポータブルではないため、これはできません。どうしても相手側の制御があると仮定して動作するTCPソケットを使用しないでください。最悪の場合、プロキシアプリケーションを作成できます。

1

Chrisが指摘するように、stdinからポーリングし、処理するための表示スレッドまたは処理スレッド用のデータを取り込む別のスレッドを用意することが、Chrisさんから指摘されています。

これで確実にQTimerを設定し、から読み取る信号のハンドラを設定することができます。実装方法は、あなた次第です。

そして、2番目の方法については、これを行う方法の例についてはQT's timer class documentationをご覧ください。あなたの処理が完了したら、実際にタイマーを再起動することを忘れないでください。

+0

これは、携帯電話やラップトップのバッテリ寿命に与える影響を見るまで、良い考えです。あなたのアプリケーションを遅く感じさせる人工的な遅延を導入することは言うまでもありません。 –

+0

@ericdescourtisこの回答が5年以上経過していれば、今より良い選択肢があります。 – Karlson

+0

あなたの疑問にお答えしますでしょうか? –

2

ブーストを使用している場合は、Asioライブラリを使用できます。 STDIN_FILENOに割り当てられたposix::stream_descriptorは非常にうまく機能します。 this answerも参照してください。

1

あなたはQTのイベントループ、あなたはどちらかと標準入力/標準出力/標準エラー出力I/Oを統合したい場合はQSocketNotifier

QSocketNotifier * notifier = new QSocketNotifier(FDSTDIN, QSocketNotifier::Read); 
connect(notifier, SIGNAL(activated(int)), this, SLOT(readStdin(int))); 
+0

あなたはそれを試しましたか?それは実際に動作しますか? – megazord

+0

私はそれを試していない、この解決策を見つけたsomwhere –

+1

私は試みた。残念ながらそれはしません:((http://pastebin.com/8yWyMmsx – borisbn

関連する問題