如何暂停线程(python)

如何暂停线程(python),python,multithreading,qt,python-multithreading,Python,Multithreading,Qt,Python Multithreading,上下文: 我正在用Qt-creator和python中的“behavior”文件构建一个图形界面。我的GUI的测试版本是: 预期行为: 我正在运行两个不同的线程,它们使用不同的输入参数引用同一个函数。使用选择器按钮,我可以将1或2的值分配给变量(并显示它) 按钮启动线程可启用正确的线程启动(第一次)。 通过修改全局running变量,可通过停止按钮关闭循环。 这是我的密码 # -*- coding: utf-8 -*- from PyQt4 import QtCore, QtGui, uic

上下文: 我正在用Qt-creator和python中的“behavior”文件构建一个图形界面。我的GUI的测试版本是:

预期行为: 我正在运行两个不同的线程,它们使用不同的输入参数引用同一个函数。使用选择器按钮,我可以将1或2的值分配给变量(并显示它) 按钮启动线程可启用正确的线程启动(第一次)。 通过修改全局
running
变量,可通过停止按钮关闭循环。 这是我的密码

# -*- coding: utf-8 -*-

from PyQt4 import QtCore, QtGui, uic
import sys
import threading
import time
import Queue

running = False
first_thread = None
second_thread = None
form_class = uic.loadUiType("simple2.ui")[0]
q = Queue.Queue()
select = 0


def action(string, queue): #function called by threads
    global running
    while(running):
        phrase = string       
        if queue.qsize() < 10:
            queue.put(phrase)
        #else:
        #   print queue.qsize()

class MyWindowClass(QtGui.QMainWindow, form_class):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.setupUi(self)

        #buttons        
        self.startButton.clicked.connect(self.start_clicked)
        self.stopButton.clicked.connect(self.stop_clicked)
        self.selector.clicked.connect(self.sel_click)
        #variables
        self.first = False
        self.second = False
        #queue
        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.update_phrase)
        self.timer.start(1)

    def start_clicked(self): #start button callback
        global select
        if select > 0:
            global running
            running = True
            print "started"
            if (not self.first) & (select == 1):
                first_thread.start()
                self.first = True
            if (not self.second) & (select == 2):
                second_thread.start()
                self.second = True
            self.startButton.setEnabled(False)
            self.startButton.setText('Starting...')

    def stop_clicked(self): #stop button callback
        global running
        running = False
        print "stopped"
        self.startButton.setEnabled(True)
        self.startButton.setText('Start Thread')

    def sel_click(self): #selector button callback
        global select
        if select < 2:
           select = select + 1
        else:
            select = 1
        self.thread_counter.setText(str(select))

    def update_phrase(self): #looping function
        global running
        if (not q.empty()) & running:
            self.startButton.setText('Thread on')
            abc = q.get()
            print abc


    def closeEvent(self, event):
        global running
        running = False

if __name__ == "__main__":
    first_thread = threading.Thread(target=action, args = ("first", q))
    second_thread = threading.Thread(target=action, args = ("second", q))
    app = QtGui.QApplication(sys.argv)
    w = MyWindowClass(None)
    w.setWindowTitle('Multiple threads  test in python')
    w.show()
    app.exec_()
#-*-编码:utf-8-*-
从PyQt4导入QtCore、QtGui、uic
导入系统
导入线程
导入时间
导入队列
运行=错误
第一个线程=无
第二个线程=无
form_class=uic.loadUiType(“simple2.ui”)[0]
q=队列。队列()
选择=0
def action(字符串、队列):#线程调用的函数
全球运行
运行时:
短语=字符串
如果queue.qsize()小于10:
queue.put(短语)
#其他:
#打印队列.qsize()
类MyWindowClass(QtGui.QMainWindow,form_类):
def uuu init uuu(self,parent=None):
QtGui.QMainWindow.\uuuuu init\uuuuu(self,parent)
self.setupUi(self)
#钮扣
self.startButton.clicked.connect(self.start\u clicked)
self.stopButton.clicked.connect(self.stop\u clicked)
self.selector.clicked.connect(self.sel\u click)
#变数
self.first=False
self.second=False
#排队
self.timer=QtCore.QTimer(self)
self.timer.timeout.connect(self.update\u短语)
自动定时器启动(1)
def start_单击(自身):#启动按钮回调
全局选择
如果选择>0:
全球运行
运行=真
打印“已启动”
如果(非自我优先)和(选择==1):
第一个线程。开始()
self.first=True
如果(非自我秒)和(选择==2):
第二个线程。开始()
self.second=True
self.startButton.setEnabled(False)
self.startButton.setText('Starting…'))
def stop_单击(自身):#停止按钮回调
全球运行
运行=错误
打印“已停止”
self.startButton.setEnabled(真)
self.startButton.setText('Start Thread'))
def sel_单击(自身):#选择器按钮回调
全局选择
如果选择<2:
选择=选择+1
其他:
选择=1
self.thread_counter.setText(str(select))
def update_短语(自身):#循环函数
全球运行
如果(不是q.empty())&正在运行:
self.startButton.setText('Thread on')
abc=q.get()
印刷abc
def关闭事件(自身、事件):
全球运行
运行=错误
如果名称=“\uuuuu main\uuuuuuuu”:
first_thread=threading.thread(target=action,args=(“first”,q))
second_thread=threading.thread(target=action,args=(“second”,q))
app=QtGui.QApplication(sys.argv)
w=MyWindowClass(无)
w、 setWindowTitle('python中的多线程测试')
w、 show()
app.exec()
现在,每个线程都应该在终端上简单地打印它们的参数(“第一个”或“第二个”)。 如果线程是第一次启动,我的代码就可以工作。但我想无限次地在线程之间切换

由于线程无法停止,有没有办法“暂停”线程?


我找不到解决方案,我希望有人也能帮我写一段代码。提前感谢您

您可以使用Lock类来完成此操作,一个简单的示例是:

import threading

lock = threading.Lock()

//here it will be lock 
lock.acquire() # will block if lock is already held
   ... 
那么在另一边呢

//this will wake up
lock.release()

您可以在此处阅读更多内容

谢谢您的回答。请问我应该把锁放在哪里?我本应该把它们放在按钮的开始/停止回调中,但它似乎是错的。Lock类似乎是我所需要的,但我仍然无法理解它在我的情况下是如何工作的。@Marcresk没关系,使用多线程很难思考,听着,我现在可以给你线索,我正在工作,但可以肯定的是,Lock.acquiere()方法将在函数stopThread()中,在它的末尾,然后你必须有另一个线程“侦听”对于start()函数,您需要对互斥、并发编程、线程和锁做一些研究,希望我能提供更多帮助