QThread: уничтожено во время работы потока - приложение для сокетов - PullRequest
0 голосов
/ 13 января 2020

Я создаю своего рода TeamViewer, где я являюсь сервером и отправляю сообщения другим клиентам, чтобы я мог удаленно блокировать их экраны, клавиатура и т. Д. c. но клиент не работает. Он подключается к серверу, но затем:
QThread: Destroyed while thread is still running
, и он аварийно завершает работу сервера, когда я запускаю клиент, но все равно возникает та же ошибка.
Посмотрите по коду моего клиента:

from PyQt5.QtCore import QObject, pyqtSignal, QThread
from PyQt5.QtWidgets import QApplication, QMainWindow
from ctypes import wintypes
from sys import exit as sys_exit
import socket
import webbrowser
import ctypes
import keyboard
import errno

HEADER_LENGTH = 100

ip_file = open('server_ip.txt', 'r')

ip_address = str(ip_file.readlines(1))

IP = ip_address[2:-2].strip()
PORT = 5005

client_soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_soc.connect((IP, PORT))
client_soc.setblocking(False)


def link_received(data):
    try:
        webbrowser.open_new_tab(data)
    except webbrowser.Error as e:
        print("(ERROR) WEBBROWSER MODULE ERROR!", str(e))


def lock_pc(data):
    ctypes.windll.user32.LockWorkStation()


def block_keyboard(data):
    while data:
        try:
            BlockInput = ctypes.windll.user32.BlockInput
            BlockInput.argtypes = [wintypes.BOOL]
            BlockInput.restype = wintypes.BOOL

            BlockInput(True)

        except Exception as e:
            print("(ERROR) KEYBOARD BLOCKING ERROR!", str(e))

        finally:
            keyboard.wait()


def block_mouse(data):
    pass


class Window(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.start_thread()

    def start_thread(self):
        thread = ReceiverThread()
        thread.data_link.connect(link_received)
        thread.data_lock_pc.connect(lock_pc)
        thread.data_block_k.connect(block_keyboard)
        thread.data_block_m.connect(block_mouse)

        thread_holder = QThread()
        thread.moveToThread(thread_holder)
        thread_holder.started.connect(thread.thread_runner)

        thread_holder.start()


class ReceiverThread(QObject):
    data_link = pyqtSignal(object)
    data_lock_pc = pyqtSignal(object)
    data_block_k = pyqtSignal(object)
    data_block_m = pyqtSignal(object)

    def __init__(self):
        QObject.__init__(self)

    def thread_runner(self):
        while True:
            try:
                msg_header = client_soc.recv(HEADER_LENGTH)
                msg_length = int(msg_header.decode('utf-8'))
                msg = client_soc.recv(msg_length).decode('utf-8')

                if "<LINK>" in msg:
                    msg_list = msg.split("|<->|")
                    link = msg_list[1]
                    self.data_link.emit(link)

                if msg == "<LOCK_PC>":
                    self.data_lock_pc.emit(True)
                elif msg == "<BLOCK_KEYBOARD>":
                    self.data_block_k.emit(True)
                elif msg == "<BLOCK_MOUSE>":
                    self.data_block_m.emit(True)

                if msg == "<UNBLOCK_KEYBOARD>":
                    self.data_block_k.emit(False)
                elif msg == "<UNBLOCK_MOUSE>":
                    self.data_block_m.emit(False)

            except IOError as e:
                if e.errno != errno.EAGAIN and e.errno != errno.EWOULDBLOCK:
                    print("(ERROR) Reading error!", str(e))

            except Exception as e:
                print("(ERROR) General error!", str(e))


if __name__ == "__main__":
    MainThread = QApplication([])

    MainWindow = Window()
    MainWindow.show()

    sys_exit(MainThread.exec_())

Я думаю, что код сервера не нужен, хотя, если это поможет, я могу отредактировать вопрос и вставить код сервера. Я действительно смущен. Поток должен начать нормально. Я использовал многопоточность PyQt5, потому что мне было трудно с обычным классом Python. Вот почему поток наследуется от QObject, а затем запускается из потока QThread. Я пытался не подклассифицировать QThread. Буду очень признателен за любую помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...