問題タブ [qthread]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
5 に答える
87243 参照

multithreading - QThreadを実装する正しい方法は何ですか...(例をお願いします...)

QThread の Qt ドキュメントには、QThread からクラスを作成し、run メソッドを実装するように記載されています。

以下は、4.7 Qthread ドキュメントからの抜粋です...

独自のスレッドを作成するには、QThread をサブクラス化し、run() を再実装します。例えば:

したがって、私が作成したすべての単一のスレッドで、私はそれを実行しましたが、ほとんどの場合、問題なく動作します (どのオブジェクトにも moveToThread(this) を実装していませんが、うまく機能します)。

先週、問題が発生し (オブジェクトを作成した場所を回避することで問題を解決できました)、次のブログ投稿を見つけました。ここでは基本的に、QThread をサブクラス化することは実際には正しい方法ではない (そしてドキュメントが正しくない) ことを示しています。

これは Qt 開発者からのものなので、一見して興味があり、さらに考えてみると、彼に同意します。オブジェクト指向の原則に従って、クラスをサブクラス化してそのクラスをさらに強化したいだけです...クラスのメソッドを直接使用するだけではありません...それがインスタンス化する理由です...

カスタム QObject クラスをスレッドに移動したいとしましょう...それを行う「正しい」方法は何でしょうか? そのブログ投稿で、彼は「どこかに例がある」と言っています...しかし、誰かが私にそれをさらに説明できれば、それは大歓迎です!

アップデート:

この質問は非常に注目を集めているため、QThread を実装する「適切な」方法を含む 4.8 ドキュメントのコピー アンド ペーストを次に示します。

Worker::workerThread不要であり、例では使用されていない余分なメンバーが含まれていることを指摘することは、依然として価値があると思います。その部分を削除すると、Qt でスレッド化を行う方法の適切な例になります。

0 投票する
4 に答える
13190 参照

c++ - インクルード ファイル QtCore が見つかりませんか?

私は C++ でマルチスレッド プログラムを作成しており、使用する予定QThreadです。問題は、しようとしたときに#include <QtCore>...エラーが発生することです...Cannot find include file QtCore.

何を与える?

0 投票する
1 に答える
1064 参照

multithreading - 非UIQThreadからQStandardItemModelを変更しますか?

にバインドQStandardItemModelし、QListViewバックグラウンド/非UIスレッドからモデルを更新するQt4アプリがあります。

場合によっては、UI以外のスレッドからQStandardItem'ssetText(..)メソッドが非常に繰り返し呼び出されると、アプリケーションがdataChanged(..)ハンドラーでクラッシュします。setText("xxxxx")forループで繰り返し呼び出すことで、問題を再現できます。私のアプリでは、データはネットワークから読み取られるため、UI以外の別のスレッドでモデルを更新します。

これは一般的なpbですか?私が正しく理解している場合、これはキューに入れられた接続に関連しており、QStandardItemModelスレッドセーフではありませんか?この問題を回避するにはどうすればよいですか?

ありがとう!

0 投票する
1 に答える
408 参照

c++ - クラスのstart関数をそれ自体の内部から呼び出せないのはなぜですか?

私はスレッドを使ったプログラミングにまったく慣れていません。クラスはQThreadsを使用しているので、なぜQThreadのstart関数をそれ自体の内部から呼び出して、そのrun関数を別のスレッドとは独立して実行し始めることができないのか疑問に思います(プログラムはクラッシュするようです。これを行う)。代わりに、オブジェクトが宣言された場所からstart関数を呼び出す必要があります。どうしてこれなの?

いくつかのコード:

それは基本的に私のクラスが行うことです。プログラムを呼び出すとsomeFunctionクラッシュします。startただし、ステートメントを削除し、プログラムの外部からsomeFunction呼び出すと、正常に機能します。start

0 投票する
1 に答える
393 参照

c++ - Qスレッドの混乱

Windows 7 Ultimate (32 ビット)マシンでQt 4.7.0 (32 ビット)を使用しています。私はおそらくバージョン 4.0 または 4.2 から Qt を使用しており、ほぼすべての4.xyリリースを使用しています。

最近、Qt 4.7 で問題が発生しました。

Qt の古いバージョンでマルチスレッド アプリケーションを作成しました。バージョンを忘れてしまいましたが、適切にコンパイルして実行した最後のバージョンは、おそらく 4.5.x または 4.6.x です。4.7 ではネジ部分が正しく動作していないようです。または、何かを誤解していました。問題は次のとおりです。

メインスレッドはスレッドを開始thinkerします。スレッドのrun()機能は次のとおりです。thinker

の信号は、すべての のスロットに接続されて_sub_thinkerいます。すべての s が終了すると、が呼び出されます。finished()ThinkerThread::subThinkerFinished()_sub_thinker_sub_thinkerThinkerThread::subThinkerFinished()quit()

quit()と呼ばれる別の場所があります。

メインスレッドから、実行は次のようになります。

  • thinker.tryKill() [注: 最初の実行では、thinker は実行されていませんでした。]
  • thinker.start()

thinkerfinished()信号は に接続されていautoMove()ます。

以前のすべてのバージョンの Qt では、autoMove()が呼び出された後thinker::quit()に呼び出されましThinkerThread::subThinkerFinished()た。4.7 では、スレッドが実行されていなくても、 のautoMove()最初の呼び出しの後に呼び出されることがわかりました。thinker.tryKill()

何か案が?

もちろん、実行中ThinkerThread::tryKill()かどうかthinkerは内部で確認できます。しかし、なぜこれが起こっているのか知りたいです。

ありがとう。

0 投票する
2 に答える
14132 参照

qt - QT の別のスレッドで関数を実行する

Qt アプリケーション コードClass Aには、 のようなメンバー メソッドが 1 つありmethod1()ます。このメソッドを別のメンバー関数で呼び出して、別のスレッドmethod2()で実行したいと考えています。mehtod1()しかし、qtのドキュメントから見つけたのは次のとおりです。

  1. class MyThreadから新しい (仮定)を継承しQThreadます。
  2. 関数メソッドrun()を必要なコードでオーバーライドします。
  3. MyThreadinのオブジェクトを作成し、Class A必要な場所で run 関数を呼び出します。

しかし、上記は少し複雑に思えます。Qt に新しいQThread(継承せずに) を即座に作成し、このスレッドでmethod1()実行して、実行が終了した後method2()に戻ることができるメカニズムはありますか?method1()

私の質問が明確でない場合はお知らせください。

0 投票する
1 に答える
1421 参照

qt - 別のスレッドでファイルのコピー操作が機能しませんか?

アプリケーションの GUI がフリーズしないように、他のスレッドでファイルをコピーするコードを実行しようとしています。

別のスレッドでは機能していないようです。

なぜ機能しないのですか?

0 投票する
1 に答える
3279 参照

pyqt4 - PyQt:QThreadからQPixmapを処理するにはどうすればよいですか?

これは私がPyQTで遭遇した最大の迷惑である必要があります:私は自分のアプリケーションのサムネイルスレッドを一緒にハックしました(私はたくさんの大きな画像をサムネイル化する必要があります)、そしてそれはうまくいくようです(そしてそれはほとんどうまくいきます)。私の主な問題はSIGNAL、スレッドからを送信するたびにこのエラーメッセージが表示されることです。

これを回避する方法がわかりません。QIconを通過させようとしましSIGNALたが、それでも同じエラーが発生します。それが役立つ場合は、これを処理するコードブロックを次に示します。

Thumbnailerクラス:

スレッドを呼び出す部分(一連の画像がリストボックスにドロップされたときに発生します):

私はGUI初心者なので、この種のものをどのように処理するかわかりません;)

ありがとうございます。

0 投票する
5 に答える
11363 参照

multithreading - QTimer を使用して 10 秒ごとに QTextBrowser にメッセージを出力する方法は?

私はこれに何時間も取り組んでいますが、それを理解することも、オンラインで役立つヘルプを見つけることもできません. 基本的に私が達成しようとしていることの要点は、ボタンとQTextBrowser. ボタンを押すと、メッセージが表示され、このメッセージが 10 秒ごとに出力され続けます。

10 秒ごとにメッセージを表示するタイマーを用意するのは理にかなっているので、QTimer を使用すると考えました。これを `buttonClicked() SLOT に最初に実装したとき、プログラムがフリーズしました。オンラインで解決策を探したところ、QApplication::processEvents() が見つかりました。

したがって、基本的に私の機能では、次のようなものがありました。

timer.isActive() while ループから抜け出すだろうと考えましたが、単にそこにとどまるわけではありません。

したがって、これはスレッドの問題であると考えました。だから私は QThreads を使用する方法を考え出しましたが、まだ動作させることができません。基本的に、タイマーを使用してスレッドを作成し、スレッドがタイマーに開始を指示すると、プログラムが終了し、コンソールに「プログラムが予期せず終了しました」と表示されます。

これを行うには簡単な方法が必要ですが、Qt での私の実績は常に次のとおりです。

0 投票する
1 に答える
1032 参照

c++ - QThreads の同時実行の問題。同じシグナルを受信するスレッドが互いにブロックしている

そのため、ビデオをリアルタイムで処理するプログラムに取り組んでおり、スレッドが互いに「ブロック」するという問題が発生しています。

私のシステムは、ほとんど次のように設定されています。

(これらのクラスはすべて QThread を拡張しています。)

そのため、DataSourceThread はビデオストリームからフレームをフェッチし、フレームを含む信号をレシーバーに送信します。接続タイプ: Qt::DirectConnection

レシーバーは基本的に DataSourceThread によって送信されたフレームを受信し、プロセッサが前のフレームの処理を完了すると、フレームを含む信号をプロセッサに送信します。接続タイプ: Qt::QueuedConnection。 プロセッサが前のフレームの処理を完了していない場合、信号を送信せずに戻ります (フレームをスキップします)。

これが機能するかどうかをテストするために、Processor1 がフレームを受信したときにメッセージを出力し、Processor2 がQThread::sleep(3);を実行しただけです。メッセージを印刷します。

(レシーバーは、フレームをプロセッサーに渡す前に、フレームのディープ コピーも行います。)

期待される結果:

Processor1 は常にメッセージを出力している必要があります。Processor2 は 3 秒ごとにメッセージを出力する必要があります。

問題:

両方のプロセッサが同時に (3 秒ごとに) メッセージを出力します。Processor1 は、メッセージを出力する前に、Processor2 が完了するまで待機します。したがって、出力は次のようになります。

等々。

ここでアイデアが不足しているので、どんな助けでも大歓迎です!

編集: コードの一部を次に示します。

main.cpp:

DataSourceThread.cpp から:

FrameReceiver.cpp:

GUIThread.cpp: (プロセッサ 1)

FrameProcessor.cpp

DetectorThread (Processor2)は guithread と同じことを行いますが、setFrame で 3 秒間スリープします。