2

関数setModelが並列スレッドで実行されると (threading.Timer または threading.thread を試しました)、次のようになることに気付きました。

QObject: Cannot create children for a parent that is in a different thread.
(Parent is QHeaderView(0x1c93ed0), parent's thread is QThread(0xb179c0), current thread is QThread(0x23dce38)
QObject::startTimer: timers cannot be started from another thread
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QTreeView(0xc65060), parent's thread is QThread(0xb179c0), current thread is QThread(0x23dce38)
QObject::startTimer: timers cannot be started from another thread

これを解決する方法はありますか?

4

2 に答える 2

5

Qt (およびその他の豊富なフレームワーク) のマルチスレッド使用は繊細で困難な作業であり、明示的な注意と注意が必要であることは、実際の現実です。、まだ読んでいない人のための提案された読み物とともに)。

可能であれば、私がいつも提案する、Python でのスレッド化のための最も健全なアーキテクチャを提案します。各サブシステムを所有し、単一の専用スレッドで使用できるようにします。のインスタンスを介してQueue.Queue、つまりメッセージ パッシングによってスレッド間で通信します。このアプローチは少し制限的かもしれませんが、具体的に識別され、慎重に設計された例外 (スレッドプール、生成される時折の新しいスレッド、ロック、条件変数、およびその他のそのような厄介なものに基づく;-) の優れた基盤を提供します。後者のカテゴリでは、キュー接続を介したクロススレッド シグナル/スロット通信など、Qt 固有のものも分類します。

于 2009-09-17T01:52:29.193 に答える
0

そこでQtの制限にぶつかったようです。オブジェクトがスレッド間で通信する必要がある場合は、シグナルまたはイベントを使用してみてください。

または、これについて Qt の人々に尋ねてください。PyQt に固有のものではないようです。

于 2009-09-16T18:58:17.033 に答える