python - 线程只有在使用蓝牙功能时才会出现问题
问题描述
我想设置一个线程,以便蓝牙可以在我的主程序运行时继续在后台扫描设备。这就是我的文件的结构:
主程序.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 文档中搜索该术语,但它没有提供任何内容,所以我不确定这是指什么。
解决方案
这只是一个猜测,但蓝牙不喜欢在单独的线程中调用。它在搜索设备时会导致“死锁”。我不明白为什么线程不只是死,因为当我自己运行蓝牙代码时,它结束得很好。
无论如何,我并没有真正解决这个问题,但它仍然做了我想要它做的事情。如果有人遇到我遇到的同样愚蠢的问题,这就是发生的事情。
我刚刚运行了蓝牙代码,就像你通常运行导入的代码一样:
mything = BluetoothClass()
mything.main()
然后我在一个守护线程中运行我的主程序。
所以蓝牙在主线程中运行,而主程序在单独的线程中运行。但这使它看起来像蓝牙在后台运行并继续运行主程序,直到触发蓝牙中的某些内容。
我将选择我自己的答案作为正确的答案,因为它确实解决了我打算做的事情。如果其他人提出更好的答案,我将重新接受它作为新答案。
推荐阅读
- customization - Acumatica - 即使保存到数据库,数据在自定义字段中显示的问题
- python - 使用 Python 将现有 BQ 表中的列添加到另一个 BQ 表
- c# - 使用连续移动 ONVIF 时可选的 `Timeout` 值应该是什么值
- hazelcast-jet - 如何修复意外的 hazelcast 客户端关闭
- .htaccess - 友好 URL 的返回 404
- c# - 比较 2 个相同对象类型的列表
- json - T-SQL - JSON_QUERY :选择属性名称中带有特殊字符的 json 属性
- android - 为什么 Android 视图值在运行时不同?
- linux - Why does echo `cat file` lose all formatting?
- android - How to encrypt the Key and IV which used in AES Encryption Model in android App