2013-08-05 49 views
0

我有一個將數據存儲爲List的QTablewView,該列表是模型的後端數據。 QThread如何在tableview模型的共享列表上使用readwritelock?

self.shots=[{'name':'abc010','taskdir','/show/abc/abc010','file':'xxx.ma'}, 
      {'name':'abc020','taskdir','/show/abc/abc020','file':'yyy.ma'}, 
       ... ] 

name, taskdir,file屬性是從3獨立的QThread,當我按下一個按鈕,創建了3個線程,他們得到了我的self.shots列表中的第一個元素的結果,他們運行一個接一個,然後我再次點擊按鈕,另外3個線程返回列表中的第二個元素(字典)。等等。

所以基本上我的問題是我需要使用讀寫鎖在這種情況下?我的線程正在寫入同一個列表,(因爲當第一個3線程仍在運行時,我可能會再次按下按鈕。)

當前我在不使用任何readwritelocks的情況下隨機獲取segfault。這是墜毀的原因嗎?

如果有人能給我一個關於如何使用讀寫鎖定的僞代碼,非常感謝。

我正在使用此通用線程函數來創建我的線程。

class GenericThread(QThread): 
    def __init__(self, function, *args, **kwargs): 
     QThread.__init__(self) 
     # super(GenericThread, self).__init__() 

     self.function = function 
     self.args = args 
     self.kwargs = kwargs 

    def __del__(self): 
     self.wait() 

    def run(self, *args): 
     self.function(*self.args, **self.kwargs) 

回答

0

你能提供一些更多的代碼,因爲我不清楚線程是如何通信的。

一些言論:

  • 你應該將數據存儲在模型中,而不是在視圖中。這就是使用模型/視圖設計的關鍵,它消除了數據一致性問題,並使得可以擁有同一模型的多個視圖。 Qt Model/View Tutorial

  • 你不應該繼承的QThread,而是使用moveToThread(QThread的*)與所需的功能線程移動對象。 How To Really, Truly Use QThreads