此线程上没有运行事件循环
No event loop is runing on this thread
我正在创建一个新线程来将 UI 接口与数据处理逻辑分开。但是由于我完全无法理解的原因,当我构建和 运行 我的应用程序时,应用程序迅速崩溃异常:
File "capnp/lib/capnp.pyx", line 2150, in capnp.lib.capnp._DynamicCapabilityClient._send
capnp.lib.capnp.KjException: src/kj/async.c++:53: failed: expected loop != nullptr; No event loop is running on this thread.
stack: 0x7f9bd4774489 0x7f9bd477845d 0x7f9bd4c0aacc 0x7f9bd49a81cb 0x7f9bd49a8207 0x7f9bd49a8304 0x7f9bd54d0341 0x7f9bd4edb93e 0x7f9bd4edba96 0x7f9bd4ec305e 0x7f9bd4ec43e9 0x7f9bd4eb0651 0x7f9bd54b5ad8 0x7f9bd5485844 0x55b92dc620c5 0x55b92dd55107
我不确定构建系统中的什么会导致这个 运行time 错误,这是我的代码,我最好的猜测是某种神秘的链接怪癖,但我不知道是什么或如何修复它。
import sys
import os
from PyQt5.QtCore import *
from PyQt5.QtGui import QGuiApplication
from cnc import Cnc
cnc = Cnc(os.path.join(os.getenv("HOME"), "cnc"), "192.168.7.98")
class workthread(QThread):
def __init__(self):
super(workthread, self).__init__()
def run(self):
self.cnc_axis_names = {axis.id: axis.name.absolute for axis in cnc.axes}
self.coors = {self.cnc_axis_names[id_]: coor for id_, coor in cnc.axes.coors().items()}
data = list(self.coors.values())
print(data)
self.sleep(1)
self.run()
self.exic_()
if __name__ == '__main__':
thread1 = workthread()
thread1.start()
app = QGuiApplication(sys.argv)
sys.exit(app.exec_())
欢迎就如何解决此问题提出任何建议。
我不知道 cnc
是什么,但我猜它使用 Cap'n Proto RPC。 Cap'n Proto RPC 使用单线程事件循环并发模型,因此最初在一个线程上创建的 RPC 对象无法在另一个线程上进行操作。
在您的程序中,您将在启动时在主线程中创建 cnc
对象。然后您创建一个新线程并尝试从那里访问该对象。这行不通。您需要在单个线程上构造和使用该对象。
我正在创建一个新线程来将 UI 接口与数据处理逻辑分开。但是由于我完全无法理解的原因,当我构建和 运行 我的应用程序时,应用程序迅速崩溃异常:
File "capnp/lib/capnp.pyx", line 2150, in capnp.lib.capnp._DynamicCapabilityClient._send
capnp.lib.capnp.KjException: src/kj/async.c++:53: failed: expected loop != nullptr; No event loop is running on this thread.
stack: 0x7f9bd4774489 0x7f9bd477845d 0x7f9bd4c0aacc 0x7f9bd49a81cb 0x7f9bd49a8207 0x7f9bd49a8304 0x7f9bd54d0341 0x7f9bd4edb93e 0x7f9bd4edba96 0x7f9bd4ec305e 0x7f9bd4ec43e9 0x7f9bd4eb0651 0x7f9bd54b5ad8 0x7f9bd5485844 0x55b92dc620c5 0x55b92dd55107
我不确定构建系统中的什么会导致这个 运行time 错误,这是我的代码,我最好的猜测是某种神秘的链接怪癖,但我不知道是什么或如何修复它。
import sys
import os
from PyQt5.QtCore import *
from PyQt5.QtGui import QGuiApplication
from cnc import Cnc
cnc = Cnc(os.path.join(os.getenv("HOME"), "cnc"), "192.168.7.98")
class workthread(QThread):
def __init__(self):
super(workthread, self).__init__()
def run(self):
self.cnc_axis_names = {axis.id: axis.name.absolute for axis in cnc.axes}
self.coors = {self.cnc_axis_names[id_]: coor for id_, coor in cnc.axes.coors().items()}
data = list(self.coors.values())
print(data)
self.sleep(1)
self.run()
self.exic_()
if __name__ == '__main__':
thread1 = workthread()
thread1.start()
app = QGuiApplication(sys.argv)
sys.exit(app.exec_())
欢迎就如何解决此问题提出任何建议。
我不知道 cnc
是什么,但我猜它使用 Cap'n Proto RPC。 Cap'n Proto RPC 使用单线程事件循环并发模型,因此最初在一个线程上创建的 RPC 对象无法在另一个线程上进行操作。
在您的程序中,您将在启动时在主线程中创建 cnc
对象。然后您创建一个新线程并尝试从那里访问该对象。这行不通。您需要在单个线程上构造和使用该对象。