4

複数のスレッドを使用しない方法はありますか?

これを見つけましたhttps://stackoverflow.com/a/17329626/4014896

しかし、私はそれがどのように機能するかわかりません。この例では、CPU 使用率が 100% になるべきではありませんか? QTなどに埋め込むにはどうすればよいですか?

これもあります: https://github.com/svalaskevicius/qt-event-dispatcher-libuv しかし、ドキュメントはまったくありません。しかし、私の見た目からは、例の QSocket から uv_tcp_socket に変換するもののように見えますが、これは私が探しているものではありません。

4

1 に答える 1

6

つまり、2 つのイベント ループをマージするか、別のスレッドを使用してイベント ハンドラを手動で同期する必要があります。

貼り付けた最初のリンクは、最後の呼び出し以降に発生した libuv イベントを処理する方法を示しています。ディスパッチされたイベントがない場合、そこに記載されている while は最大 100% の CPU を使用します (ポーリングを継続するため)。

2 番目のリンク (qt-event-dispatcher-libuv) は、同じ問題に取り組むために私が作成したプロジェクトです。ただし、libuv を使用して Qt のイベント ループを処理する (そしてそれを行うことにより、2 つのイベント ループを 1 つにマージする) ことによって、説明したとおりに機能します。

これを使用するには、 http://qt-project.org/doc/qt-5/qcoreapplication.html#setEventDispatcherを使用してアプリケーションにイベント ディスパッチャを登録するだけです。このライブラリが使用される例 - https://github.com/svalaskevicius/qtjs-generator/blob/master/src/runner/main.cpp#L179

このアプローチにはまだ 1 つの問題があります。Linux では非常にうまく機能しますが、Qt の Cocoa プラットフォーム サポート プラグインが一部の Cocoa のイベント ループ操作を処理し、それをマージするための適切な API も提供しないため、OS X ではいくつかの問題があります。 (現在、短いタイムアウトの後に解放されたものを更新しているため、GUI イベントを処理するための (かろうじて?) 顕著な遅延があります) - プラットフォームサポートプラグインを移植して統合できるようにすることを計画していましたが、それはまだです将来は。そして、私はまだWindowsでテストしていません:)

別の解決策は、おそらく私が行った別の方向から2つのループをマージしようとすることです.Qtでlibuvを使用する代わりに、Qtのハンドラーを使用するlibuvのAPIを提供できます. .

他に提供できる情報があれば教えてください。

よろしく、

于 2014-09-13T16:36:00.797 に答える