問題タブ [qtimer]
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.
c++ - Qt - 単純なループの実行が徐々に遅くなる
メインウィンドウコード内にループがあります。これは、画面上のいくつかのテキストボックスの色を変更するだけです。それは単純ですが、すべての色の変更をユーザーに見えるfor(int i=0; i<200; i++)
ようにしたいので、ループ内に10ms の一時停止のような sth を追加しようとしたので、すべての実行が画面に表示されます。
私はこれを使用しました:
問題は、この 10ミリ秒のペースを常に維持したいので、操作全体に約 2 秒かかることです。残念ながら、それは徐々に遅くなり、非常に激しく、最後の ~20 回の実行にはそれぞれ約 1 秒かかります。
i<20~50のときはかなりまともに見えますが、追加すると大幅に遅くなります...
あまり新品ではないPCのことも考えましたが、操作自体はとても簡単なので、PCが遅いせいではないと思います。私のアプローチが間違っていると思います
PS。実行中、ram usage
私のアプリは約21MBで、cpu
約20-30%です
c++ - QThread の拡張とは関係のない QTimer
この質問は、誰かが独自のクラスでスレッドをオーバーロードしているときに何らかの形で回答されているようですが、QThread クラスを拡張せずに QTimer クラスを使用しようとするとどうなりますか。QTimer for QT を使用しようとしています。彼らの簡単な例
http://qt-project.org/doc/qt-4.7/qtimer.html
その例は次のとおりです。
しかし、これを試みると、エラーが発生し続けます。
QObject::startTimer: タイマーは、QThread で開始されたスレッドでのみ使用できます。
私は、Jamie King による YouTube のゲーム エンジン開発シリーズの一連のビデオに取り組んでいます。私は彼のビデオを最後まで追うつもりなので、現時点ではまったく異なるコーディング手法を抽象化することは好まれません。これは私がこれまでに持っているものです。
コードをできるだけシンプルに保つために、小さな簡単なサイド プロジェクトを作成しようとしました。ビルド エラーはありません。プログラムが開始された後にのみ発生します。
QTimerApp.cpp
GLWin.h
GLWin.cpp
私が思いついた研究のほとんどは、クラスが QThread を拡張したときに run() 関数をオーバーロードすることに関係しています。私が知る限り、単純なタイマー ループが発生するために別のクラスを拡張したり作成したりする必要はありません。すでに QWidget を拡張しているので、私のオブジェクトはすでに QObject タイプです。
どんな支援も本当に感謝しています。ありがとうございました!
c++ - QTimer->remainingTime() は -1371648957 を返します
Qt 5.3.2 を使用して次のコードを実行すると、残り時間が -1371648957 に設定されます。
その後、ループで残り時間を出力し続けると、負の値が増加するため、発生することtimeout()
はありません。これは本当に意味がありません。
少しコンテキストを与えるために、このコードは別のスレッド内で実行され、QTimer はスレッド化されたオブジェクトのコンストラクターで作成されません。
わかりやすくするために更新されたコードを次に示します。
emit
メインスレッドが受信したことを通知できるため、タイマーの作成が別のスレッドで正しく実行され、スレッド内の Qts イベントループが機能していることを確認しました。
また、このようにタイマーを設定しても違いはありません
秒数を 100000 または 0 に変更すると、アプリケーションを再起動すると残り時間が -1374002988 にわずかに変化しますが、長さは変わりません。
また、ライン上のデバッガーで確認したところtimer->remainingTime()
、内部inter
変数は正しく 100 に設定されています。
これはメモリアドレスかそのようなものでしょうか?
qt - Qt で QEventLoop で QTimer singleShot を使用する方法
QTimer singleShot を使用して QDialog を開き、ステータス フラグを待つ必要があります。この変数が true の場合、続行します。
これは私のコードです
StatusFlag = FALSE;
NewGUI コンストラクターで StatusFlag が TRUE に設定されている
現在の出力は
期待される出力は
行にコメントすると
QTimer::singleShot(0, this, SLOT(OpenWindow()));
次に、出力は
何か提案はありますか?
c++ - スレッドからスプラッシュ スクリーンを再描画する / アサーションを無効にする
問題
QTimer
を使用して、プログレス バーを描画する派生を更新しQSplashScreen
(ウィジェットではなくペイント コマンドを使用)、プログラムの実行開始時期を予測したいと考えています。
必然的に、これは のexec
呼び出しの前に発生しQCoreApplication
ます。これをX11 と Windowsの両方で (リリース モードでのみ) 動作させるには、2 番目のスレッドにタイマーを配置し、スプラッシュ スクリーンで進行状況を更新してウィジェットを再描画する関数を呼び出します。ただし、次のエラーが発生するため、これはデバッグ モードでは機能しません。
"ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread."
コードはリリース時にクラッシュせず、スプラッシュ画面にすぎないため、このアサーションについてはあまり心配していませんが、プログラムをデバッグで実行できるようにする必要があるため、次のいずれかを行いたいと思います a) コードをリファクタリングするアサーションをトリガーしないか、b) この特定のアサーションを無効にします。
試した:
update()
の代わりに使用しrepaint()
ます。finish
これはアサーションを引き起こしませんが、メインスレッドが共有ライブラリなどでロードするのにビジーであり、スプラッシュ画面で呼び出す準備ができるまでタイマーイベントが処理されないため、再描画もされません.QTimer
メインループから開始。上記と同じ結果です。- を使用し
QT::QueuedConnection
ます。同じ結果です。
主要
スプラッシュスクリーン
MyMainWindow
c++ - Blackberry10カスケードqmlRegisterTypeはオブジェクトを登録できません
これは私がタイマーを登録した方法です:
そして、これが私がそれを使用している方法です: