编辑9/15/16:在我最初的代码中(仍然张贴在下面),我试图将.join()
与函数一起使用,这是一个愚蠢的错误,因为它只能用于thread对象。我正在努力
(1) 连续运行获取数据并将其保存到文件中的线程
(2) 有第二个线程或合并队列,一旦用户输入一个标志(即“停止”),它将停止程序。它不会中断数据收集/保存线程。在
我需要多线程的帮助。我尝试运行两个线程,一个处理数据,另一个检查是否有标志来停止程序。在
我通过反复试验了解到,如果计算机没有爆炸,我就不能中断while循环。另外,我已经放弃了GUI代码,因为它使我的代码在mulithreading中过于复杂。在
我要做的是运行一个线程,从Arduino收集数据,将其保存到一个文件中,然后重复这个过程。第二个线程将扫描一个标志——它可以是一个原始的输入?我想不出用户还能做什么来停止数据采集程序。在
我非常感谢在这方面的任何帮助。以下是我的代码(如您所见,大部分是伪代码):
#threading
import thread
import time
global flag
def monitorData():
print "running!"
time.sleep(5)
def stopdata(flag ):
flag = raw_input("enter stop: ")
if flag == "stop":
monitorData.join()
flag = "start"
thread.start_new_thread( monitorData,())
thread.start_new_thread( stopdata,(flag,))
当我尝试在空闲状态下输入“stop”时,我得到的错误是这个。在
由启动的线程中出现未处理的异常 回溯(最近一次呼叫): stopdata中第16行的文件“c:\users\otangu~1\appdata\local\temp\IDLE\u rtmp_h_frd5” AttributeError:“function”对象没有属性“join”
再一次,我真的很感谢你的帮助,到目前为止我已经自学了Python,这是我遇到的第一堵巨大的墙。在
这是不可能的。线程函数必须完成。你不能从外面加入。在
你在找这样的东西:
您在代码中犯了一些明显的错误和一些不太明显的错误。首先,join是在线程对象而不是函数上调用的。类似地,join不会杀死线程,它会等待线程完成。线程在没有更多代码可执行时结束。如果你想让一个线程在某个标志被设置之前一直运行,通常在你的线程中包含一个循环,它每隔一秒左右检查一次标志(这取决于你需要的计时有多精确)。在
此外,螺纹模块优于低杆螺纹模块。后者已在Python3中移除。在
您看到的错误是对函数调用join的结果。您需要对
thread
对象调用join
。您没有捕获对线程的引用,因此您无论如何也无法调用join
。你应该这样。在对于解决方案,可以使用
^{pr2}$Queue
在线程之间进行通信。队列用于向worker线程发送一个quit消息,如果worker在一秒钟内没有从队列中获取任何信息,它将运行从arduino收集数据的代码。在它可能比您希望的代码多了一点,并且必须检测到队列是空的(有一个异常)有点难看,但是这不依赖于任何全局变量,并且总是会立即退出。基于
sleep
的解决方案则不是这样,它需要等待任何当前对sleep
的调用完成,然后才能继续执行。在正如其他人所指出的,您应该真正使用
threading
,而不是旧的thread
模块,而且我建议您使用python3而不是python2来学习。在相关问题 更多 >
编程相关推荐