首页 > 解决方案 > 线程只有在使用蓝牙功能时才会出现问题

问题描述

我想设置一个线程,以便蓝牙可以在我的主程序运行时继续在后台扫描设备。这就是我的文件的结构:

主程序.py

class MainClass():
    def something():
        mythread = threading.Thread(target=BluetoothClass.main, args=[self], daemon=True)
        mythread.start()

if __name__ == '__main__':
    start = MainClass()
    start.something()

bluetoothstuff.py

class BluetoothClass():
    def main():
        devices = bluetooth.discover_devices(lookup_names=True)

当 mainprogram.py 运行时,会出现以下错误:

WARNING: nextEventMatchingMask should only be called from the Main Thread! This will throw an exception in the future.

如果我去掉 bluetoothstuff.py 中的蓝牙线,并放入其他东西,例如print()or time.sleep(3),它运行良好,没有错误。

在其他答案中,我已经看到,显然当您使用蓝牙时,它会“放弃”主线程,但我尝试过搜索,但我仍然不确定这意味着什么。我已经调用了解释器正在运行的文件中的线程,那不是主线程吗?

我也尝试nextEventMatchingMask在 Python 文档中搜索该术语,但它没有提供任何内容,所以我不确定这是指什么。

标签: pythonmultithreadingbluetooth

解决方案


这只是一个猜测,但蓝牙不喜欢在单独的线程中调用。它在搜索设备时会导致“死锁”。我不明白为什么线程不只是死,因为当我自己运行蓝牙代码时,它结束得很好。

无论如何,我并没有真正解决这个问题,但它仍然做了我想要它做的事情。如果有人遇到我遇到的同样愚蠢的问题,这就是发生的事情。

我刚刚运行了蓝牙代码,就像你通常运行导入的代码一样:

mything = BluetoothClass()
mything.main()

然后我在一个守护线程中运行我的主程序。

所以蓝牙在主线程中运行,而主程序在单独的线程中运行。但这使它看起来像蓝牙在后台运行并继续运行主程序,直到触发蓝牙中的某些内容。

我将选择我自己的答案作为正确的答案,因为它确实解决了我打算做的事情。如果其他人提出更好的答案,我将重新接受它作为新答案。


推荐阅读