Python2.7中的信号量是否可以仅将metod作为线程的目标?

Python2.7中的信号量是否可以仅将metod作为线程的目标?,python,multithreading,python-2.7,python-multithreading,Python,Multithreading,Python 2.7,Python Multithreading,我试图做的是运行或暂停两个不同的函数,这取决于它们各自的选项按钮是否处于活动状态(两个函数的执行是互斥的)。我根据Jay给出的答案尝试使用信号量,但两个线程似乎都在继续运行。这里是我正在编写的代码(它位于\uuu init\uu块中): 自动线程和手动线程似乎都在继续执行,因为threading.enumerate()一直显示它们处于活动状态(我希望其中一个在选中另一个函数的单选按钮时消失,在再次选中自己的单选按钮时重新启动): 在Jay给出的答案中,我可以看到他正在创建继承自thread的

我试图做的是运行或暂停两个不同的函数,这取决于它们各自的选项按钮是否处于活动状态(两个函数的执行是互斥的)。我根据Jay给出的答案尝试使用信号量,但两个线程似乎都在继续运行。这里是我正在编写的代码(它位于\uuu init\uu块中):

自动线程和手动线程似乎都在继续执行,因为
threading.enumerate()
一直显示它们处于活动状态(我希望其中一个在选中另一个函数的单选按钮时消失,在再次选中自己的单选按钮时重新启动):


在Jay给出的答案中,我可以看到他正在创建继承自
thread
的类,并将函数放在这些类中。这就是我所期望的行为所需要做的吗??你能提供一些关于如何让我的代码按预期工作的想法吗?和往常一样,先谢谢你

问候,,
Ron

我认为尝试同步线程比它的价值更麻烦。您需要考虑定时窗口,例如当两个线程恰好检查它们时,GUI更改状态。将逻辑从函数中去掉,并在每个循环中调用一个或另一个更高级别的函数会更容易。该函数可以告诉工作函数是否存在需要更改gui的状态更改

def Exec_Manual(state_changed):
    if state_changed:
        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))
    time.sleep(1)

def Exec_Auto(state_changed):  
    if state_changed:
        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
    self.lblTx1.setText(str(efrec-0.4))
    self.lblTx2.setText(str(efrec))
    self.lblTx3.setText(str(efrec+0.4))
    time.sleep(1)

def the_decider():
    state = self.rbtnAuto.isChecked()
    while True:
        new_state = self.rbtnAuto.isChecked()
        if new_state:
            Exec_Auto(state == new_state)
        else:
            Exec_Manual(state == new_state)
        state = new_state

auto_thread = threading.Thread(target=the_decider, name='the_decider')
auto_thread.start()

对不起,这个问题不好,我在写了整个描述之后读了一遍,发现它可能并不代表我真正想问的。希望我能解释我自己。
threading.enumerate
将显示它们都是活动的,因为即使它们碰巧在等待信号量。我假设
rbtnAuto
rbtnMan
属于同一个单选按钮组,并且不能同时设置它们?如果未选中
rbtnAuto
,可以公平地说该状态是手动的吗?谢谢您的回答@tdelaney是的,当一个单选按钮被选中时,另一个不能。至于资源使用。。。例如,查看执行手册。如果
如果self.rbtnMan.isChecked():
为真,则需要做一些工作,然后再睡1秒。但如果为false,则立即重新运行循环并再次检查。谢谢@tdelaney,我要试试这个。如果可能有帮助的话,另一个问题是,当程序启动时,它在资源监视器中显示CPU的使用率至少为50%,但当我单击另一个单选按钮时,CPU的使用率达到100%(代码仍在运行,GUI没有冻结)。我尝试了您的代码,它有点像我预期的那样工作(CPU使用率约为50%)但它不会改变标签中的值(例如,在Exec_Auto函数中,它应该以3个为一组显示FM频谱的每个频率),我通过使用您删除的循环获得这些值。你删除for循环有什么原因吗?我没有太多注意for的内部,因为它似乎与手头的问题无关。。。TL;我想是吧!不管怎样,你可以把它贴回去。我刚刚添加了for循环,它非常有效!伙计,CPU使用率只有30%左右。我希望能给你买杯啤酒。谢谢你,真的。哈哈。。。明天晚上我会在棉花底部。
<_MainThread(MainThread, started 140030203459328)>
<Thread(manual_thread, started daemon 140029502768896)>
<Thread(auto_thread, started daemon 140029154293504)>
def Exec_Manual(state_changed):
    if state_changed:
        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))
    time.sleep(1)

def Exec_Auto(state_changed):  
    if state_changed:
        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
    self.lblTx1.setText(str(efrec-0.4))
    self.lblTx2.setText(str(efrec))
    self.lblTx3.setText(str(efrec+0.4))
    time.sleep(1)

def the_decider():
    state = self.rbtnAuto.isChecked()
    while True:
        new_state = self.rbtnAuto.isChecked()
        if new_state:
            Exec_Auto(state == new_state)
        else:
            Exec_Manual(state == new_state)
        state = new_state

auto_thread = threading.Thread(target=the_decider, name='the_decider')
auto_thread.start()