线程只有在使用蓝牙功能时才会出现问题
Thread only has issues when it uses bluetooth function
我想设置一个线程,以便蓝牙可以在我的主程序运行时继续在后台扫描设备。
我的文件结构如下:
mainprogram.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()
或 time.sleep(3)
,它运行良好,没有错误。
在其他答案中,我看到显然当您使用蓝牙时,它 "gives up" 是主线程,但我已经尝试搜索但我仍然不确定这意味着什么。我在文件中调用了解释器是运行的线程,那不是主线程吗?
我也曾尝试在 Python 文档中搜索术语 nextEventMatchingMask
,但没有找到任何结果,所以我不确定它指的是什么。
这只是一个猜测,但蓝牙不喜欢在单独的线程中调用。它会在搜索设备时导致 'deadlock'。我不明白为什么线程不会死掉,因为当我 运行 蓝牙代码本身时,它结束得很好。
无论如何,我并没有真正解决这个问题,但它仍然按照我的意愿进行。如果有人 运行 遇到了我遇到的同样愚蠢的问题,这就是发生的事情。
我只是 运行 蓝牙代码,就像您通常 运行 导入的代码一样:
mything = BluetoothClass()
mything.main()
然后我 运行 我的主程序在守护线程中。
所以蓝牙 运行 在主线程中,而主程序 运行 在单独的线程中。但它让蓝牙看起来像是在后台 运行ning 并保持 运行ning 主程序直到蓝牙中的某些东西被触发。
我将选择我自己的答案作为正确答案,因为它确实解决了我的意图。如果其他人提出更好的答案,我会重新接受它作为新答案。
我想设置一个线程,以便蓝牙可以在我的主程序运行时继续在后台扫描设备。 我的文件结构如下:
mainprogram.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()
或 time.sleep(3)
,它运行良好,没有错误。
在其他答案中,我看到显然当您使用蓝牙时,它 "gives up" 是主线程,但我已经尝试搜索但我仍然不确定这意味着什么。我在文件中调用了解释器是运行的线程,那不是主线程吗?
我也曾尝试在 Python 文档中搜索术语 nextEventMatchingMask
,但没有找到任何结果,所以我不确定它指的是什么。
这只是一个猜测,但蓝牙不喜欢在单独的线程中调用。它会在搜索设备时导致 'deadlock'。我不明白为什么线程不会死掉,因为当我 运行 蓝牙代码本身时,它结束得很好。
无论如何,我并没有真正解决这个问题,但它仍然按照我的意愿进行。如果有人 运行 遇到了我遇到的同样愚蠢的问题,这就是发生的事情。
我只是 运行 蓝牙代码,就像您通常 运行 导入的代码一样:
mything = BluetoothClass()
mything.main()
然后我 运行 我的主程序在守护线程中。
所以蓝牙 运行 在主线程中,而主程序 运行 在单独的线程中。但它让蓝牙看起来像是在后台 运行ning 并保持 运行ning 主程序直到蓝牙中的某些东西被触发。
我将选择我自己的答案作为正确答案,因为它确实解决了我的意图。如果其他人提出更好的答案,我会重新接受它作为新答案。