1

初心者の質問ですが、実際には行き詰まっています。「高レベル」のc++スレッド関数(pthreadもQThreadも)を使用することは許可されていません。ただし、winAPI関数createThreadを使用して作成する必要のあるスレッドがいくつかあります。そして、それらのスレッドはいくつかの変数を変更するために使用します。QLineEditコンポーネントでこれらの変数を1秒ごとに表示したいと思います。だから私は次のようなコードを試しました:

    stillWorking = true;
    while(stillWorking){
        ui->editElement->setText(QString::number(getVariableValue()));
        qDebug() << 'running!!!'
        Sleep(1000);
    }

stillWorkingブール値は、いくつかのボタンがクリックされたときに設定されますfalse。それが私がこのループを止めたい方法です。しかし、コードを実行すると、editElementは更新されず、アプリケーションは応答を停止します。ただし、'running!!!'文字列は毎秒デバッグセクションに適切に出力されます。それで、私の変数にアクセスして表示する他の方法はありますか?

4

2 に答える 2

3

許可されている場合は、を使用する必要QTimerがあります(スレッドの使用が許可されている場合でも)。UIスレッドで何らかのブロックを実行しても機能しません。イベント処理を機能させるにはリリースする必要があり、クリックに反応するにはイベント処理が必要です。

タイマーページには、もう少し情報とその使用方法の例があります。ここでのアイデアは、単純に次のことを行うスロットを作成することです。

ui->editElement->setText(QString::number(getVariableValue()));

そしてそのスロットに接続された繰り返しタイマー。

getVariableValue()(これは、が適切に同期されており、実際に他のスレッドから更新された値を確認していることを前提としています。)

于 2012-11-18T20:08:59.050 に答える
0

これらの2つの方法のいずれかを使用できます。

最初の1つはマットから上で説明されています

2番目の方法は、クラスがQObjectから派生した場合、timerEventをオーバーライドできます。

class MyObject : public QObject
{
    Q_OBJECT

public:
    MyObject(QObject *parent = 0);

int timerID;


protected:
    void timerEvent(QTimerEvent *event);
};

MyObject::MyObject(QObject *parent)
    : QObject(parent)
{

    timerID = startTimer(1000);   // 1-second timer

}

void MyObject::timerEvent(QTimerEvent *event)
{

    ui->editElement->setText(QString::number(getVariableValue()));

    this->killTimer(timerID); // you can use here if you plan stop timer

}

関数内で、whileループが中断された場合、表示されているウィジェットが更新されます。それ以外の場合、アプリケーションは機能しますが、ループ内のプロセス中にguiウィジェットは更新されません。

于 2016-04-08T22:17:52.300 に答える