如何解决Python多线程程序退出代码-1073741819
我正在为omegle编写一个桌面客户端,这是我第一次处理多线程编程。我的程序(似乎是Python本身)以代码-1073741819退出。
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtPrintSupport import *
import os
import sys
from python_omegle.randomchat import RandomChat
from python_omegle.chatevent import ChatEvent
import threading
import enum
class ChatState(enum.Enum):
NONE = 1
WAITING = 2
CONNECTED = 3
CLOSING = 4
OPENING = 5
QUIT = 6
class MainWindow(QMainWindow):
def __init__(self,*args,**kwargs):
super(MainWindow,self).__init__(*args,**kwargs)
self.layout1 = QVBoxLayout()
self.layout2 = QHBoxLayout()
self.container = QWidget()
self.container.setLayout(self.layout1)
self.setCentralWidget(self.container)
self.topics = QLineEdit()
self.output = QTextEdit()
self.message = QLabel()
self.button = QPushButton("Start")
self.input = QLineEdit()
self.layout1.addWidget(self.topics)
self.layout1.addWidget(self.output)
self.layout1.addWidget(self.message)
self.layout2.addWidget(self.button)
self.layout2.addWidget(self.input)
self.layout1.addLayout(self.layout2)
self.output.setReadOnly(True)
self.input.setFocus()
self.button.clicked.connect(self.on_button_pressed)
self.chat_thread = threading.Thread(target=self.chat)
self.chat_state = ChatState.NONE
self.chat_thread.start()
def closeEvent(self,event):
self.chat_state = ChatState.QUIT
event.accept()
def on_window_close(self):
self.chat_state = ChatState.QUIT
def on_button_pressed(self):
state = self.button.text()
if state == "Start":
self.chat_state = ChatState.OPENING
self.button.setText("Stop")
elif state == "Stop":
self.button.setText("Really?")
elif state == "Really?":
self.button.setText("Start")
self.chat_state = ChatState.CLOSING
def chat(self):
chat = RandomChat()
while True:
if self.chat_state == ChatState.OPENING:
chat.start()
self.chat_state = ChatState.WAITING
self.output.clear()
elif self.chat_state == ChatState.CLOSING:
chat.disconnect()
self.message.setText("You have disconnected.")
self.chat_state = ChatState.NONE
elif self.chat_state == ChatState.WAITING:
while True:
event,argument = chat.get_event()
if event == ChatEvent.CHAT_READY:
self.message.setText("You're now chatting with a random partner.")
self.chat_state = ChatState.CONNECTED
break
elif event == ChatEvent.CHAT_WAITING:
self.message.setText("Looking for someone you can chat with...")
elif self.chat_state == ChatState.CONNECTED:
while True:
event,argument = chat.get_event()
if event == ChatEvent.GOT_MESSAGE:
message = argument
self.output.append("Partner: {}".format(message))
elif event == ChatEvent.CHAT_ENDED:
self.message.setText("Partner has disconnected.")
self.button.setText("Start")
self.chat_state = ChatState.NONE
break
elif self.chat_state == ChatState.QUIT:
break
def GUI():
app = QApplication(sys.argv)
app.setApplicationName("oclient")
window = MainWindow()
window.show()
app.exec_()
if __name__ == '__main__':
GUI()
我怀疑由于在主线程和MainWindow.chat_state
中都更改了chat_thread
的值而导致错误。之所以需要多线程方法,是因为函数RandomChat.get_event
直到至少有一个事件可用时才返回。
可以在这里找到omegle api:https://github.com/coal0/python-omegle我也在使用pyqt5。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。