問題タブ [qeventloop]
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.
qt - Qtライブラリのイベントループの問題
別のアプリケーションでプラグインとして使用され、Qtの機能を活用したいDLLを作成しています。
すべてのクラスをセットアップ、コンパイル、実行していますが、信号が出力されていません。したがって、QEventLoopがないように見えます。
試行1:
メインクラスをQObjectではなくサブクラスQThreadに変更し、run()でQEventLoopを作成し、すべてのシグナル/スロットを接続して、スレッドを実行します。
しかし、QApplicationなしではQEventLoopを使用できないとは言えません。
試行2:
メインクラスを変更して(まだQThraedをサブクラス化)、代わりにQCoreApplicationをインスタンス化し、すべてのシグナル/スロットを接続してから、アプリケーションを実行します。
QApplicationがmain()スレッドで作成されておらず、それでもシグナルを発行しないことを警告します。
ここで何をすべきかよくわかりません。プラグインを使用するアプリケーションでQCoreApplicationを作成することはできません。また、プラグインがないとシグナルを送信できません。
私の問題を説明する簡単な(そして恐ろしく書かれた)テストアプリケーションを含めました:
どんな助けでもいただければ幸いです!
main.cpp:
ThreadThing.h:
ThreadThing.cpp:
出力:
qt - QDialogが別のQDialogをポップアップ
サブクラス化された QSpinBox の束を含むサブクラス化された QDialog があります。スピンボックスをクリックすると、プッシュボタンを使用して数字を入力できるキーパッド (別の QDialog)。両方の QDialog は、QDialog::exec(); を呼び出すことによってアクティブ化されます。
ただし、この 2 番目の QDialog を開くと、最初の QDialog が閉じます。私はそれをステップ実行しましたが、最初の QDialog がまだ終了していないことに気付きました。QDialog 1 は、QDialog 2 を終了した後に "QDialog::Rejected" を送信します。QDialog 1 がまったく終了しないようにする必要があります。入力した値でスピンボックスを更新し、他のスピンボックスのためにさらに多くの QDialog を開く必要があります。ユーザーは後で編集したいと考えています。
QDialog 1のイベントループがQDialog 2のイベントループによって殺されたことに関係していると思います。QDialog 2 で QDialog::show を使用してみました。ウィジェットは一瞬 (ミリ秒) ポップアップしますが、アクティブなままではありません。QDialog 1 もすぐに閉じられます。
qt - QEventLoop および QNAM での QTimer タイムアウトの問題
QNAM を利用し、HTTP 要求を送信する手段を提供する独自の HTTP クラスを作成しました。同期には QEventLoop を使用し、タイムアウトには QTimer を使用します。
私は自分のソリューションでいくつかの問題に直面しています。特定の Symbian プラットフォームでは、私の QTimer シグナルのタイムアウトが速すぎます (たとえば、タイムアウトが 30 秒のときに 1 秒後など)。これは通常、HTTP Post プレイロードが大きい場合、または GET を介してファイルをダウンロードしている場合に発生します (リクエストが完了するまでに時間がかかります)。特定のデバイス (S60 第 3 版) では同じコードが正常に動作することに注意したいのですが、一部のデバイス (第 5 版) ではほぼ常にこのエラーが発生します。
コード スニペットを次に示します。
個人的には、次のいずれかが問題を引き起こす可能性があると考えています。
- ローカル イベント ループに再度入ると、信号が台無しになります
- 同じ QNAM を複数回利用しています (同じセッション中に複数のリクエスト)。QNAM を破棄すると、サーバー側でセッションがダウンするため、これが必要です。
この動作を引き起こす可能性のあるエラーを誰かが見ることができますか?
プラットフォーム: Symbian S60 3rd/5th エディション
ツール: Nokia Qt SDK
qt - QThread/QDialogを使用した競合状態
次のシナリオでは、競合状態を回避しようとしています。
QDialog :: exec()がダイアログを設定する前にスレッドが終了すると、シグナルによってトリガーされた「accept()」呼び出しは失われ、ダイアログは自動的に閉じません...
したがって、理想的には、ダイアログがスレッドを処理する準備ができた後でのみスレッドを開始したいのですが、これをどのように行うのでしょうか?
c++ - すべてのアプリケーションのイベントループ反復でスロットを実行する
アプリケーションのイベントループが繰り返されるたびにスロットを呼び出すにはどうすればよいですか?私が知っている唯一の方法は、QTimerを使用することであり、すべてのタイムアウト(ミリ秒ごと)信号でスロットを呼び出すことができます。しかし、私はこのオプションが好きではありません、それは回避策のように見えます。
これをより正確に行う方法の提案はありますか?
python - PYQT - キャンセル ボタンを使用して GUI でループをキャンセルする方法は?
私はしばらくこれに苦労してきました。私がやりたいことを説明しようと思います。多分皆さんが私を助けてくれます。
それで、ステータスラベルが付いたGUIと、次のような2つのループがあるとしましょう:
STARTが押された(完了した)後にラベル(STATUS)を結果で更新し、STOPボタンが押されているときにループをキャンセルしたい。
スレッド、QEventloop、またはその他の方法 (存在する場合) を使用してこれを達成する方法。私は PyQT の初心者なので、誰かが何か考えを持っている場合は共有してください。
ありがとう。
qt - QTの文書化されていないProcessEventsFlag列挙型
QTのモーダルダイアログは、ProcessEventFlagsが「DialogExec」に設定されたローカルQEventLoopを使用していることに気付きました。
QTアシスタントには、この列挙型の意味に関する情報がありません。EventLoopExecと呼ばれる別のものがあります。誰もがそれらが実際に何を意味するのか、そしてなぜそれらが文書化されていないのかを知っていますか?
ありがとう
python - PySideはワーカースレッドのメインスレッドからのシグナルを待ちます
スクリプトの1つにGUIを追加することにしました。スクリプトは単純なWebスクレイパーです。データのダウンロードと解析には時間がかかる可能性があるため、ワーカースレッドを使用することにしました。PySideを使用することにしましたが、Qtに関する一般的な知識は非常に限られています。
スクリプトはキャプチャに遭遇するとユーザー入力を待機することになっているため、起動するまで待機してからQLineEdit
、returnPressed
検証のために送信できるようにコンテンツをワーカースレッドに送信する必要があると判断しました。それは忙しいよりはましだろう-リターンキーが押されるのを待つ。
信号を待つのは思ったほど簡単ではないようです。しばらく検索した後、これに似たいくつかの解決策に出くわしました。ただし、スレッド間のシグナリングとワーカースレッドのローカルイベントループにより、ソリューションは少し複雑になります。
それを数時間いじった後でも、それはまだ機能しません。
何が起こるはずです:
- キャプチャを参照するまでデータをダウンロードし、ループに入ります
- キャプチャをダウンロードしてユーザーに表示し、
QEventLoop
電話をかけることから始めますself.loop.exec_()
- クラス内で接続されているワーカースレッドスロットを
QEventLoop
呼び出して終了しますloop.quit()
self.line_edit.returnPressed.connect(self.worker.stop_waiting)
main_window
- キャプチャを検証し、検証が失敗した場合はループします。それ以外の場合は、今すぐダウンロードできるはずの最後のURLを再試行してから、次のURLに進みます。
何が起こるのですか:
...上記を参照...
終了
QEventLoop
は機能しません。を呼び出した後にself.loop.isRunning()
戻ります。そのようなスレッドは奇妙な状況下で死ぬようには見えなかったので、を返します。それでもスレッドはその行で停止します。そのため、イベントループがもう実行されていないことを通知しても、スレッドはイベントループの実行でスタックします。False
exit()
self.isRunning
True
self.loop.exec_()
GUIは、ワーカースレッドクラスのスロットと同様に応答します。ワーカースレッドに送信されるテキスト、イベントループのステータス、およびスレッド自体を確認できますが、上記の行が実行された後は何も表示されません。
コードは少し複雑なので、重要でないものを除いて、疑似コード-python-mixを少し追加します。
pyqt4 - QT4Reactor / Scrapy / PyQt4
Qt4Reactorを正しい方法で使用するにはどうすればよいですか?
Scrapyを実行しているPyQt4アプリケーションを使用して、Webサイトを解析し、UIに結果を表示しています。
ユーザーがボタンをクリックすると、スクレーパーは別のプロセスで開始されます。UIがブロックされ、スクレーパーが実行されています。スクレーパーが終了すると、データがUIに表示されます。私が欲しいのは、Scrapyが実行されているときにブロックされていないUIです。
Scrapyはtwistedの上に構築されているため、UIから開始するには、スレッドではなく新しいプロセスを使用する必要があります。
私の質問は、ノンブロッキングUIを可能な限りシンプルにする方法です。
私は次のようにQt4Reactorを使用しようとしました:
これにより、エラーが発生します。
このトピックに別の質問を投稿しました: PyQt4メインループにScrapy/Twistedイベントループを統合する
前もって感謝します。
qt5 - Qt: QNetworkAccessManager はリクエストを送信しません
QNetworkAccessManager を使用して、http 要求の送信を処理しました。
行 QEventLoop().exec(); がない場合、アプリはリクエストを送信しません。しかし、行 QEventLoop().exec(); がある場合は、そうなります。私はなぜ理解していないのですか?
あなたは私をクリアできますか?
どうもありがとうございました!(P/s: このリンクを見ました: Sending an HTTP request using QNetworkAccessManager )