0

クラスAとクラスBの2つのクラスがあります。

クラス A には、Refresh2 秒ごとに QTimer を使用して呼び出されるプライベート スロットがあり、QTableView の値を更新するのに役立ちます。

クラス B は QThread によって定義されており、run関数ではソケットなどを使用してクライアントからデータを取得しています。

ここでの問題は、runクライアントからデータを取得すると QTimer がテーブルを更新し、その間にすべてのデータを更新せずに更新することです。時々更新が少なくなり、その逆もあります。これは、データが取得されるときに関数が機能するように同期する場合に実行できますRefresh。しかし、どうすればこれを行うことができますか? は別のクラスであるためRefresh、QTimer をスリープと同期する方法、またはクラス B でのみその関数を呼び出す方法を考えました。

4

2 に答える 2

2

@spykeが提案したように、Qtでミューテックス(QMutex)を使用します。データを含むクラスにミューテックスを追加します。

クラスのヘッダーファイルで:

class MyDataClass : public QObject
{
    Q_OBJECT
    ...

signals: 
    void dataChanged();
private:
    QMutex mutex;
    ....

そして、データにアクセスするメソッドで:

MyDataClass::accessFromAnyThread(QString newNode) {
    mutex.lock();
    ...
    //access critical data e.g.
    this->data.append(newNode);
    ...
    mutex.unlock();
    emit dataChanged();
}

読み取りと書き込みの両方を行っている場合、パフォーマンスの問題がある場合は QSermaphore を調べる必要があります。

これがあなたをどこかに連れて行くことを願っています...

于 2012-07-12T12:40:30.517 に答える
0

あなたが何をしようとしているのか完全にはわかりませんが、QAbstractTableModel を使用できると思います。

このモデルの実装で受け取ったデータを入力し、次の方法でテーブル ビューに追加します。

yourtableview->setmodel(yourtablemodel)

次に、 Refresh() 関数などは必要ありません。テーブルビューには常にモデルのコンテンツが表示されます。

于 2012-07-13T09:32:10.537 に答える