Ошибка блокировка в Theard

Статус
Закрыто для дальнейших ответов.

Kim Jon

Новичок
Пользователь
Авг 1, 2021
18
0
1
Снова обращаюсь к Вам за помощью. Так как наши знаменитые поисковики, опять запутали и без того мою не сильно "Умную голову"
Я учу PyQt6 по книге "Python 3 и PyQt6 разработка приложений", и остановился на теме "Блокировки в Theard". Написав листингe который находиться ниже
Код:
from  PyQt6 import QtCore, QtWidgets

class MyThread(QtCore.QThread):
    x = 10          # Атрибут класса
    mutex = QtCore.QMutex() # Блокировщик
    def __init__(self, id, parent=None):
        QtCore.QThread.__init__(self, parent)
        self.id = id
    def run(self):
        self.change_x()
    def change_x(self):
        MyThread.mutex.lock()   # Блокируем
        print("x = ", MyThread.x, "id = ", self.id)
        MyThread.x += 5
        self.sleep(2)
        print("x = ", MyThread.x, "id = ", self.id)
        MyThread += 34
        print("x = ", MyThread.x, "id = ", self.id)
        MyThread.mutex.unlock()

class MyWindow(QtWidgets.QPushButton):
    def __init__(self):
        QtWidgets.QPushButton.__init__(self)
        self.setText("Запустить")
        self.thread1 = MyThread(1)
        self.thread2 = MyThread(2)
        self.clicked.connect(self.on_start)
    def on_start(self):
        if not self.thread1.isRunning():self.thread1.start()
        if not self.thread2.isRunning():self.thread2.start()

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    window.setWindowTitle("Использование блокировки")
    window.show()
    sys.exit(app.exec())
у меня не может определить Class который называется MyTheard() скриншот находиться ниже :
Unresolved.png
из-за этого выходит ошибка "Process finished with exit code -1073740791 (0xC0000409)"
Пожайлуйста подскажите что я неправильно сделал..... Вроде делал всё как сказано в книге. Но все бесщетно...
sad.gif
 

Dr. Mundo

Модератор
Команда форума
Модератор
Фев 13, 2024
21
1
3
В строке MyThread += 34 есть опечатка. Вы пытаетесь прибавить число к самому классу, а не к атрибуту класса x. Должно быть:

Код:
MyThread.x += 34

Также обратите внимание на название класса. В вашем сообщении вы упомянули "MyTheard", но в коде правильно написано "MyThread" (Thread, а не Theard).

Вот исправленный код:

Python:
from PyQt6 import QtCore, QtWidgets

class MyThread(QtCore.QThread):
    x = 10          # Атрибут класса
    mutex = QtCore.QMutex() # Блокировщик
    def __init__(self, id, parent=None):
        QtCore.QThread.__init__(self, parent)
        self.id = id
    
    def run(self):
        self.change_x()
    
    def change_x(self):
        MyThread.mutex.lock()   # Блокируем
        print("x = ", MyThread.x, "id = ", self.id)
        MyThread.x += 5
        self.sleep(2)
        print("x = ", MyThread.x, "id = ", self.id)
        MyThread.x += 34        # Исправлено здесь
        print("x = ", MyThread.x, "id = ", self.id)
        MyThread.mutex.unlock()

class MyWindow(QtWidgets.QPushButton):
    def __init__(self):
        QtWidgets.QPushButton.__init__(self)
        self.setText("Запустить")
        self.thread1 = MyThread(1)
        self.thread2 = MyThread(2)
        self.clicked.connect(self.on_start)
    
    def on_start(self):
        if not self.thread1.isRunning(): self.thread1.start()
        if not self.thread2.isRunning(): self.thread2.start()

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    window.setWindowTitle("Использование блокировки")
    window.show()
    sys.exit(app.exec())

После этих исправлений код должен работать корректно. Теперь при нажатии на кнопку будут запускаться два потока, которые будут последовательно изменять общую переменную x, используя мьютекс для синхронизации доступа.
 

PYDEV

Модератор
Команда форума
Модератор
Авг 31, 2023
79
21
8
MyThread.mutex.lock() # Блокируем
Если хотелось обратиться к экземпляру класса MyThread используйте self:
Python:
self.mutex.lock()   # Блокируем
а если это метод для внесения изменения в Сам класс MyThread (а не в его экземпляр) используйте:
Python:
    @classmethod
    def change_x(cls):
        cls.mutex.lock()   # Блокируем
P.s: если я понял в чем именно заключается вопрос

с первым вариантом вывело чот такое:
Python:
x =  10 id =  1
x =  15 id =  1
x =  49 id =  1
x =  10 id =  2
x =  15 id =  2
x =  49 id =  2
 

Kim Jon

Новичок
Пользователь
Авг 1, 2021
18
0
1
Да все правильно. А можно полностью функцию описать, а то я написал как вы указали все равно выходит ошибка .
Код:
Process finished with exit code -1073740791 (0xC0000409)
 

PYDEV

Модератор
Команда форума
Модератор
Авг 31, 2023
79
21
8
Да все правильно. А можно полностью функцию описать, а то я написал как вы указали все равно выходит ошибка .
Код:
Process finished with exit code -1073740791 (0xC0000409)
Python:
 def change_x(self):
        self.mutex.lock()   # Блокируем
        print("x = ", self.x, "id = ", self.id)
        self.x += 5 # предполагаю это x нужно увеличить
        self.sleep(2)
        print("x = ", self.x, "id = ", self.id)
        self.x += 34
        print("x = ", self.x, "id = ", self.id)
        self.mutex.unlock()
 
Статус
Закрыто для дальнейших ответов.

Форум IT Специалистов