PyQt5, Qthread. Process finished with exit code -1073740791 (0xC0000409)

57 Views Asked by At

Good day. I can’t figure out why the program crashes with the error Process finished with exit code -1073740791 (0xC0000409). When one client connects, everything works fine, but when a second client connects, the program ends with an error. If you use the debugger, the program works fine.

from PyQt5 import QtCore, QtGui, QtWidgets
import socket, json, threading
from PyQt5.QtCore import QObject, QThread, pyqtSignal
from threading import Thread
class Ui_NetChat(QObject):
    clients = []
    nicknames = []

    def setupUi(self, NetChat):
        NetChat.setObjectName("NetChat")
        NetChat.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(NetChat)
        self.centralwidget.setObjectName("centralwidget")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.centralwidget)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.host_label = QtWidgets.QLabel(self.centralwidget)
        self.host_label.setObjectName("host_label")
        self.horizontalLayout.addWidget(self.host_label)
        self.port_label = QtWidgets.QLabel(self.centralwidget)
        self.port_label.setObjectName("port_label")
        self.horizontalLayout.addWidget(self.port_label)
        self.verticalLayout_2.addLayout(self.horizontalLayout)
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setObjectName("label_3")
        self.verticalLayout.addWidget(self.label_3)
        self.pl_log = QtWidgets.QPlainTextEdit(self.centralwidget)
        self.pl_log.setObjectName("pl_log")
        self.verticalLayout.addWidget(self.pl_log)
        self.verticalLayout_2.addLayout(self.verticalLayout)
        self.horizontalLayout_2.addLayout(self.verticalLayout_2)
        self.verticalLayout_3 = QtWidgets.QVBoxLayout()
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.startPB = QtWidgets.QPushButton(self.centralwidget)
        self.startPB.setObjectName("startPB")
        self.verticalLayout_3.addWidget(self.startPB)
        self.stopPB = QtWidgets.QPushButton(self.centralwidget)
        self.stopPB.setObjectName("stopPB")
        self.verticalLayout_3.addWidget(self.stopPB)
        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout_3.addItem(spacerItem)
        self.horizontalLayout_2.addLayout(self.verticalLayout_3)
        NetChat.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(NetChat)
        self.statusbar.setObjectName("statusbar")
        NetChat.setStatusBar(self.statusbar)

        self.retranslateUi(NetChat)
        QtCore.QMetaObject.connectSlotsByName(NetChat)

        self.startPB.clicked.connect(self.start_server)

    def reportProgress(self):
        print("Hello")

    def retranslateUi(self, NetChat):
        _translate = QtCore.QCoreApplication.translate
        NetChat.setWindowTitle(_translate("NetChat", "MainWindow"))
        self.host_label.setText(_translate("NetChat", "HOST"))
        self.port_label.setText(_translate("NetChat", "PORT"))
        self.label_3.setText(_translate("NetChat", "Лог"))
        self.startPB.setText(_translate("NetChat", "Start"))
        self.stopPB.setText(_translate("NetChat", "Stop"))

    def start_server(self):
        HOST = 'localhost'
        PORT = 5555
        server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server.bind((HOST,PORT))
        server.listen()
        ui.pl_log.appendPlainText(f"Севрер запущен на HOST = {HOST} и PORT = {PORT}")

        self.thread_client_conn = QThread()
        self.wait_client = ThreadWaitClient(server)
        self.wait_client.moveToThread(self.thread_client_conn)
        self.thread_client_conn.started.connect(self.wait_client.run)

        self.wait_client.thread_cleint.connect(self.window_log)
        self.wait_client.thread_cleint.connect(self.hendler)


        self.thread_client_conn.start()


    def window_log(self, message):
        ui.pl_log.appendPlainText(str(message))

    # I know that the error is in this part of the code Pat 1
    def hendler(self, client):
        self.thread_heandler = QThread()
        self.new_heandler_message = HeandlerMessage(client)
        self.new_heandler_message.moveToThread(self.thread_heandler)
        self.thread_heandler.started.connect(self.new_heandler_message.run)


        self.thread_heandler.start()


class ThreadWaitClient(QObject):
    thread_cleint = pyqtSignal(socket.socket)
    def __init__(self, server):
        super().__init__()
        self.server = server

    def run(self):
        print("Start ThreadWaitClient____RUN")
        while True:
            client, address = self.server.accept()
            self.thread_cleint.emit(client)

"""
# I know that the error is in this part of the code Pat 2
"""
class HeandlerMessage(QObject):
    def __init__(self, client):
        super().__init__()
        self.client = client

    def run(self):
        print("Heandler run ")



if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    NetChat = QtWidgets.QMainWindow()
    ui = Ui_NetChat()
    ui.setupUi(NetChat)
    NetChat.show()
    sys.exit(app.exec_())

I was trying to get multi-threaded software using Qthread

0

There are 0 best solutions below