2012-07-12 105 views
0

我有兩個類:A類和B類Synchonizing睡眠和QTimer

A類中,我有一個私人插槽Refresh這是使用QTimer每兩秒調用,並在QTableView中更新值幫助。

B類由QThread定義,並且在run函數中,我使用套接字和全部數據從客戶端獲取數據。

現在的問題是,當run從客戶端獲取數據,然後QTimer更新表,從而更新之間沒有更新所有的數據。有時它會更新更少,反之亦然。如果我們以一種方式同步數據,Refresh函數就可以工作。但我該怎麼做?因爲Refresh是另一類,所以我想到了一種將QTimer與睡眠同步的方式,或者只能在B類中調用該函數的方法。建議我請一個方法。 感謝您提前提供任何幫助。

+0

使用共享數據,使用臨界區在QTableView中讀取和更新它,並改善您的計時器間隔。 – ScarCode 2012-07-12 11:37:03

+0

@spyke 即使我現在我應該改善我的計時器interval.thats一個顯而易見的事情,你tell.m問我可以同步,因爲我已經在不同的文件中定義這兩個類,所以我甚至不能使用全局參數。 – Mcolorz 2012-07-12 11:49:18

+0

顯然,您可以開始從其他類的數據讀取,並在另一個文件[數據讀取類]中使用互斥鎖。 – ScarCode 2012-07-12 11:54:45

回答

2

建議在Qt中使用互斥量(QMutex)作爲@spyke。在包含數據的類中添加一個互斥鎖。

類的頭文件

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如果你有性能問題。

希望這可以讓你的地方...

+0

在一個函數中,我正在採取數據,在另一個例如__Refresh__函數我更新視圖使用QStandardItem ino QTableView。 我的數據被填充到定義爲靜態的地圖中,並且在填充之後我想要refrsh函數來啓動。這是我想要的,但是現在,因爲這個刷新函數在另一個類中它的工作是獨立的並且在感覺dat – Mcolorz 2012-07-12 12:45:44

+0

之間開始看起來不錯,我猜這樣的事情會工作,但在哪個類我必須聲明互斥體,然後如何訪問它,然後什麼是QString和all.please幫助 – Mcolorz 2012-07-12 12:46:47

+0

QString只是一個示例參數。您可以在mutex.unlock語句後發出信號,並將其連接到您的視圖。那個怎麼樣? – 2012-07-12 12:53:59

0

我不完全知道你正在嘗試做的,但我認爲你可以使用一個QAbstractTableModel。

填寫你在這個模型的實現接收數據,並通過

yourtableview->setmodel(yourtablemodel) 

添加到表視圖,則不需要刷新()函數或類似的東西。 tableview將始終顯示模型的內容。