【发布时间】:2017-03-22 21:43:59
【问题描述】:
我要做的是运行或暂停两个不同的功能,具体取决于它们各自的选项按钮是否处于活动状态(这两个功能的执行是互斥的)我尝试根据 Jay @987654321 给出的答案使用信号量@ 但两个线程似乎都在继续运行。这是我正在编写的代码(它在 __init__ 块内):
self.manual_sema = Semaphore(0)
self.auto_sema = Semaphore(0)
#Function A.
def Exec_Manual():
while True:
for i in range(0,5):
if self.rbtnMan.isChecked():
if self.rbtnAuto.isChecked():
self.manual_sema.acquire()
self.auto_sema.release()
break
self._tx_freq1_line_edit.setEnabled(1)
self._tx_freq2_line_edit.setEnabled(1)
self._tx_freq3_line_edit.setEnabled(1)
self._tx_freq4_line_edit.setEnabled(1)
self._tx_freq5_line_edit.setEnabled(1)
frec = 'self._tx_freq'+str(i+1)+'_line_edit.text()'
efrec = float(eval(frec))
self.lblTx1.setText(str(efrec-0.4))
self.lblTx2.setText(str(efrec))
self.lblTx3.setText(str(efrec+0.4))
#print frec
print efrec
print threading.currentThread().getName()
for th in threading.enumerate():
print th
time.sleep(1)
manual_thread = threading.Thread(target=Exec_Manual, name='manual_thread')
manual_thread.daemon = True
manual_thread.start()
#Function B.
def Exec_Auto():
while True:
for i in range(0,17):
if self.rbtnAuto.isChecked():
if self.rbtnMan.isChecked():
self.auto_sema.acquire()
self.manual_sema.release()
break
self._tx_freq1_line_edit.setDisabled(1)
self._tx_freq2_line_edit.setDisabled(1)
self._tx_freq3_line_edit.setDisabled(1)
self._tx_freq4_line_edit.setDisabled(1)
self._tx_freq5_line_edit.setDisabled(1)
frec0=88.5
x=i*1.2
efrec = float(frec0)+x
print efrec
print threading.currentThread().getName()#Debug
for th in threading.enumerate():
print th
self.lblTx1.setText(str(efrec-0.4))
self.lblTx2.setText(str(efrec))
self.lblTx3.setText(str(efrec+0.4))
time.sleep(1)
frec0=frec0+1.2
auto_thread = threading.Thread(target=Exec_Auto, name='auto_thread')
auto_thread.daemon = True
auto_thread.start()
auto_thread 和 manual_thread 似乎都在继续执行,因为threading.enumerate() 一直显示它们处于活动状态(我希望它们在选中另一个函数的单选按钮时消失,并在再次选中它们自己的单选按钮时重新启动):
<_MainThread(MainThread, started 140030203459328)>
<Thread(manual_thread, started daemon 140029502768896)>
<Thread(auto_thread, started daemon 140029154293504)>
在 Jay here 给出的答案中,我可以看到他正在创建继承自 thread 的类并将函数放入这些类中。 ¿ 这可能是获得我所期望的行为需要做的事情吗? ¿您能否提供一些关于如何让我的代码按预期工作的想法?一如既往,提前感谢。
问候, 罗恩
【问题讨论】:
-
抱歉,问题很糟糕,我在写完整个描述后阅读了它,发现它可能不代表我实际要问的问题。希望我能解释一下自己。
-
threading.enumerate将显示他们都活着,因为即使他们碰巧在信号量上等待,他们也活着。 -
我假设
rbtnAuto和rbtnMan是同一个单选按钮组的一部分并且不能同时设置?如果rbtnAuto没有被选中,那么说状态是手动的是否公平? -
感谢@tdelaney 的回答是的,当一个单选按钮被选中时,另一个不能。
-
至于资源使用...例如看
Exec_Manual。如果if self.rbtnMan.isChecked():为真,你做一些工作然后睡1 秒。但如果它是假的,你会立即重新运行循环并再次检查。你正在把系统搞得一团糟。
标签: python multithreading python-2.7 python-multithreading