1

メインウィンドウコード内にループがあります。これは、画面上のいくつかのテキストボックスの色を変更するだけです。それは単純ですが、すべての色の変更をユーザーに見えるfor(int i=0; i<200; i++)ようにしたいので、ループ内に10ms の一時停止のような sth を追加しようとしたので、すべての実行が画面に表示されます。

私はこれを使用しました:

      QTimer t;
      t.start(10);
      QEventLoop loop;
      connect(&t, SIGNAL(timeout()), &loop, SLOT(quit()));
      loop.exec();

問題は、この 10ミリ秒のペースを常に維持したいので、操作全体に約 2 秒かかることです。残念ながら、それは徐々に遅くなり、非常に激しく、最後の ~20 回の実行にはそれぞれ約 1 秒かかります。

i<20~50のときはかなりまともに見えますが、追加すると大幅に遅くなります...

あまり新品ではないPCのことも考えましたが、操作自体はとても簡単なので、PCが遅いせいではないと思います。私のアプローチが間違っていると思います


PS。実行中、ram usage私のアプリは約21MBで、cpu20-30%です

4

1 に答える 1

2

何かを達成するのは良い方法ではありません。QTimerこのタスクには十分です。例えば:

 QTimer *t = new QTimer;//without loops and sleeping
 connect(t, SIGNAL(timeout()), this, SLOT(someSlot()));
 t->start(10);

作成someSlotし、このスロットで色を変更し、他のタスクを実行します。2 秒後にタイマーを停止するには、システム時間を使用する代わりにカウンターを使用できます。

void MainWindow::someSlot()
{
    //do something
}

また、それ10 msは非常に高速であり、人間の目はそれほど速い変化を捉えることができないと考えてください. より長い値を使用してみてください。

于 2014-12-14T10:04:52.560 に答える