Nano Hash - криптовалюты, майнинг, программирование

Как запустить два разных потока одновременно в pyqt

У меня есть ситуация, когда мне нужно запустить два потока один за другим. Я попробовал следующий фрагмент кода, здесь я смог запустить Thread12, но не смог запустить Thread2. Как я могу запустить оба ....? Как запустить 2 потока один за другим...?

Фрагмент кода

class Thread1(QtCore.QThread):

    Thread1Signal = QtCore.pyqtSignal(str)

    def __init__(self):
        super(Thread1, self).__init__()

    def run(self):
        print 'Thread1 started'
        While True:

            #some statments
            if Condition:
                Thread1Signal.emit('Yes')
            else:
                Thread1Signal.emit('No')

class Thread2(QtCore.QThread):

    Thread2Signal = QtCore.pyqtSignal(str)

    def __init__(self):
        super(Thread2, self).__init__()

    def run(self):
        print 'Thread2 started'
        While True:

            #some statments
            if Condition:
                Thread2Signal.emit('Yes')
            else:
                Thread2Signal.emit('No')

class MainClass(QtCore.QObject):

    MainSignal1 = QtCore.pyqtSignal(str)
    MainSignal2 = QtCore.pyqtSignal(str)

    def __init__(self):
        super(MainClass, self).__init__()   

        Threadinstance1 = Thread1()
        Threadinstance1.Thread1Signal.connect(MainSignal1)

        Threadinstance2 = Thread2()
        Threadinstance2.Thread2Signal.connect(MainSignal2)


   def start(self):

       Threadinstance1.start()
       Threadinstance2.start()                #Thread2 never starts.

def signal1called(s):

    print s


def signal2called(s):

    print s

if __name__=='__main__':
    app = AtGui.QApplication(sys.argv)
    temp = MainClass()
    temp.MainSignal1.connect(signal1called)
    temp.MainSignal2.connect(signal2called)
    temp.start()
    sys.exit(app.exec()_)

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

Ответы:


1

Вы будете использовать QRunnable и QThreadPool примерно так:

import sys

from PyQt4.QtGui import QApplication
from PyQt4.QtCore import QThreadPool, QObject, QRunnable, pyqtSignal

class WorkerSignals(QObject):
    result = pyqtSignal(int)

class Worker(QRunnable):
    def __init__(self, task):
        super(Worker, self).__init__()

        self.task = task
        self.signals = WorkerSignals()

    def run(self):
        print 'Sending', self.task
        self.signals.result.emit(self.task)

class Tasks(QObject):
    def __init__(self):
        super(Tasks, self).__init__()

        self.pool = QThreadPool()
        self.pool.setMaxThreadCount(1)

    def process_result(self, task):
        print 'Receiving', task

    def start(self):
        for task in range(10):
            worker = Worker(task)
            worker.signals.result.connect(self.process_result)

            self.pool.start(worker)

        self.pool.waitForDone()

if __name__ == "__main__":
    import  sys

    app = QApplication(sys.argv)
    main = Tasks()
    main.start()
    sys.exit(app.exec_())
17.12.2012
  • вы можете создать столько Worker классов, сколько хотите, создавая подклассы из QRunnable вместо QThread, а затем вызывая из Tasks 17.12.2012
  • вы имеете в виду, что мы не можем использовать QThread для моего запроса...? Вместо этого мне нужно использовать QRunnable. Какая разница между QRunnable и QThread 17.12.2012
  • Вы можете, но если вы хотите, чтобы они запускались один за другим, вы можете использовать QThreadPool, который принимает QRunnable, но не QThread, или отправить сигнал processEnded от каждого QThread и подключить его к слоту, который запускает следующий QThread 17.12.2012
  • на самом деле мне нужно, чтобы оба потока запускались одновременно.... поэтому научились запускать один за другим. но не начинать одно после завершения другого. 17.12.2012
  • запуск QThreads одновременно не должен быть проблемой, перепроверьте свой фактический код, если вы не можете, вы все равно можете использовать QThreadPool, просто пропустите часть self.pool.setMaxThreadCount(1) 17.12.2012
  • я изменил self.pool.setMaxThreadCount(1) на self.pool.setMaxThreadCount(2), так как у меня есть два определения для запуска в двух потоках... 17.12.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..