QThread如何在tableview模型中的共享列表中使用readwritelock?

时间:2013-08-05 11:01:40

标签: locking pyqt qthread

我有一个QTablewView,它将数据存储为List,列表是模型的后端数据。

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的情况下随机获得段错误。这是崩溃的原因吗?

感谢任何人都可以给我一个关于如何使用读写锁的伪代码。

我正在使用这个通用线程函数来创建我的线程。

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)

1 个答案:

答案 0 :(得分:0)

你能提供更多代码,因为我不清楚线程是如何通信的。

一些评论:

  • 您应该将数据存储在模型中,而不是存储在视图中。这就是使用模型/视图设计的重点,它消除了数据一致性问题,并使得可以拥有相同模型的多个视图。 Qt Model/View Tutorial

  • 您不应该继承QThread,而应使用 moveToThread(QThread *)将具有所需功能的对象移动到该线程。 How To Really, Truly Use QThreads