В этом потоке нет цикла событий - PullRequest
0 голосов
/ 19 декабря 2018

Я создаю новый поток, чтобы отделить интерфейс пользовательского интерфейса от логики обработки данных. Но по совершенно непостижимым для меня причинам, когда я создаю и запускаю свое приложение, приложение быстро завершает работу с исключением:

 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

Я не уверен, что в системе сборки может вызвать эту ошибку во время выполнения , вот мой код, мое лучшее предположение - какая-то странная причудливая связь, но я понятия не имею, что или как ее исправить.

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_())

Любые советы по устранению неполадок приветствуются.

1 Ответ

0 голосов
/ 22 декабря 2018

Я не знаю, что такое cnc, но я предполагаю, что он использует Cap'n Proto RPC.Cap'n Proto RPC использует однопоточную модель параллелизма цикла событий, поэтому объектами RPC, изначально созданными в одном потоке, нельзя манипулировать в другом потоке.

В вашей программе вы создаете объект cnc при запускев основной теме.Затем вы создаете новый поток и пытаетесь получить доступ к объекту оттуда.Это не сработает.Вам необходимо создать и использовать объект в одном потоке.

...