Я создаю своего рода 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
. Буду очень признателен за любую помощь.