gpt4 book ai didi

python - 树莓派上的Python线程问题

转载 作者:太空宇宙 更新时间:2023-11-03 20:20:01 25 4
gpt4 key购买 nike

我正在尝试运行一个 GUI,该 GUI 会生成在树莓派 1 上执行非常基本且计算上不复杂的任务的线程,但我似乎无法让线程工作。

我在 x86 intel 计算机上开发了代码,它运行得很好。线程命令基本上只允许按下按钮并同时监听串行数据。

    def extra_thread_disable():
# Disables buttons that would interfere with data that is currently being sent
while threading.active_count() == 3:
run_file_butt.config(state = 'disabled')
run_butt.config(state = 'disabled')
serial_butt.config(state = 'disabled')
popup_butt.config(state = 'disabled')
homing_butt.config(state = 'disabled')
level_butt.config(state = 'disabled')
zero_button1.config(state = 'disabled')
zero_button2.config(state = 'disabled')
zero_button3.config(state = 'disabled')
else:
run_file_butt.config(state = 'normal')
run_butt.config(state = 'normal')
serial_butt.config(state = 'normal')
popup_butt.config(state = 'normal')
homing_butt.config(state = 'normal')
level_butt.config(state = 'normal')
zero_button1.config(state = 'normal')
zero_button2.config(state = 'normal')
zero_button3.config(state = 'normal')
pass



def thread_data():
# Starts a thread to send data while allowing stop button to be pressed
try:
global t2
t2 = threading.Thread(name='send_line', target = send_data, daemon = True)
t_disable = threading.Thread(name='disable', target = extra_thread_disable, daemon = True)
t2.start()
t_disable.start()
except:
update_textbox("Threading Error: data thread not properly created")



def send_data():
# Sends single motion commands and waits for response to continue
global save_path
global motor_param
vals = get_vals()
try:
data = struct.pack("!llllhhhhhhhh", vals['dist1'], vals['dist2'], vals['dist34'], vals['dist34'], vals['speed1'], vals['speed2'], vals['speed34'], vals['speed34'], vals['accel1'], vals['accel2'], vals['accel34'], vals['accel34'])
try:
ser.write(data)
update_textbox("Running...")
except:
update_textbox("Error: Data not sent")
try:
motor1pos = int(ser.readline())
motor2pos = int(ser.readline())
motor3pos = int(ser.readline())
motor4pos = int(ser.readline())
ready = ser.read(1)
update_textbox("Movement complete")
axis1_current.set(str(reverse_convert(motor1pos, 1)))
axis2_current.set(str(reverse_convert(motor2pos, 2)))
axis3_current.set(str(reverse_convert(motor3pos, 3)))
writetofile()
except:
update_textbox("Error: reading data improperly")
except:
update_textbox("Error: data not sent properly")
pass

该代码基本上只允许主 GUI 线程允许按下停止按钮并禁用所有可能干扰发送数据的按钮。然后该线程只等待它所连接的 arduino 的响应。同样,这一切在普通计算机上都可以完美运行。在树莓派上运行时,我在终端中没有收到任何错误或警告,但它似乎被阻止了。我想也许这只是一台速度慢的计算机或臭名昭著的 GIL 造成的。看来可能就是这个原因。如果是这样,我应该切换到 python 中的多处理库吗?有办法解决这个问题吗?在调用 python3 的终端中运行时它不起作用,并且使用 pyinstaller 将其编译为静态二进制文件时它不起作用。

最佳答案

答案是获得更好的硬件。我没有对代码进行任何更改,而是购买了更新的树莓派 4,而不是原来的树莓派,并且线程的工作方式与我的另一台运行 arch 的电脑上最初的工作方式相同。

关于python - 树莓派上的Python线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58223931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com