2012-03-18 7 views
-2

私はC++でコード化されたQtウィジェットプロジェクトで何かを作っています。私がする必要があるため、私は無限のループが必要であり、私の研究をした後、オブジェクトイベントの無限ループが機能せず、代わりにいくつかのスレッドを使用する必要があることに気がついた。Qtウィジェットプロジェクトで無限ループする

  1. 私はQTimerを使うことに決めましたが、QThreadを使うことを考えています。どちらを使うべきですか?
  2. これは動作していないように私QTimerコード、次のとおりです。

    Clock_Application::Clock_Application(QWidget *parent) : 
        QMainWindow(parent), 
        ui(new Ui::Clock_Application) 
    { 
        ui->setupUi(this); 
        QTimer *timer_Stopwatch = new QTimer(this); 
        connect(timer_Stopwatch, SIGNAL(timeout()), this, SLOT(timer_Start())); 
        timer_Stopwatch->start(1000); 
    } 
    

編集:簡単な修正この解決策には、ループのすべての繰り返しの後、QCoreApplication::processEvents()機能を使用していますこれによりウィジェットアプリケーションは必要なイベントを処理できます。これは簡単な修正ですが、QTimerライブラリを使用する方が良い方法です。

+2

動作しないのはどうですか?目標は何ですか?詳細が必要です。 – tmpearce

+0

オブジェクトのイベントの無限ループが機能しないため、プログラムは応答しません。 – ZERO

+0

あなたが掲示したコードについて*はうまくいかないのですか? – tmpearce

答えて

2

あなた自身が提案したように、別のスレッドで処理を実行することはオプションになります。あなたがそれを示すようにQTimerが役立つとは思いません。

ただし、各ループの最後に手作業でQCoreApplication::processEvents()を呼び出すのが簡単です。これにより、保留中のすべてのイベントがQtによって処理され、UIが応答可能になります。

+0

ありがとう、これをした後、私のプログラムは働いた!残念ながら、私は画面を動かそうとすると、プログラムは比較的遅いです。私はあなたが理解できるように完璧主義者なので、もっと滑らかにする方法はありますか? – ZERO

+0

1ループでもかなりの時間がかかりますので、おそらく遅れがちです。私が言ったように、それは単なる速い修正です。かなりの量の処理が行われている場合は、実際に別のスレッドで処理したいと思うかもしれません。 – Bart

-1

タイマーはコンストラクタ内にのみ存在するため、タイマーは機能しません。ヘッダーファイルのコンストラクターを非公開として宣言する必要があります。

+0

これは間違っています。私はQtエキスパートではありませんが、それを使用するオブジェクトをインスタンス化する場所は問題ありません。 – lokusking