pyqt threading - данные не сохраняются на жесткий диск - PullRequest
0 голосов
/ 07 февраля 2019

Я новичок в программировании потоков, и я считаю, что мой вопрос охватывает некоторые базовые концепции, которые я не уловил.В моем коде я создаю отдельный поток для реализации некоторого преобразования изображения.

self.create_samples - в этом методе я пытаюсь записать изображение на жесткий диск, и ожидаемый результат должен иметь массивизображений, но я получаю следующее: одно изображение сохраняется в течение доли секунды, а затем сразу исчезает (появляется следующее обработанное изображение).

В результате я застрял с одним изображением в моем каталоге,Я играл с разными типами времени и размера стека для потока - ничего не помогло.

Как только я понял, проблема связана с тем, что поток использует свой собственный стек, и мне нужно скопировать изображениекак-то из стека на жесткий диск.

Вопрос в том, какой подход я должен использовать, чтобы поток добавлял изображения в каталог, а не в один, полученный на текущей итерации?

class SamplesWorker(QObject):

def __init__(self, function, *args, **kwargs):
    super(SamplesWorker, self).__init__()

    self.function = function
    self._run = True
    self.args = args
    self.kwargs = kwargs
    self.start.connect(self.run)
    self.mutex = QMutex()
    self.delay = 1000

start = pyqtSignal(int)
finished = pyqtSignal(int)
value_changed = pyqtSignal(int)

@pyqtSlot(int)
def run(self, some_string_arg):
    while self._run:
        try:
            self.mutex.lock()
            self.function(*self.args, **self.kwargs)
            self.mutex.unlock()
            self.value_changed.emit(1)
            QtCore.QThread.msleep(self.delay)
        except: pass

Как все это инициализировать:

            self.csQThread1 = QtCore.QThread()
            self.csQThread1.finished.connect(self.csQThread1.deleteLater)

            self.csWorker1 = SamplesWorker(self.create_samples)

            self.csWorker1.moveToThread(self.csQThread1)
            self.csWorker1.value_changed.connect(self.create_samples_set_pb_value)

            self.csQThread1.start()
            self.csWorker1.start.emit(1)


    def create_samples(self):
       #some calculations
       #...
            cv2.imwrite(dst,image)
...