gpt4 book ai didi

python - 如何在Python中停止单个多处理进程?

转载 作者:太空宇宙 更新时间:2023-11-03 18:21:24 24 4
gpt4 key购买 nike

下面的代码创建一个带有三个进度条的对话框窗口。每个进度条都链接到三个进程之一,所有进程均使用多处理池启动。

enter image description here

右键单击进度栏时,将显示“停止进程”菜单。该菜单链接到非功能性 stopProc() 函数。目标是利用“Stop Process()”函数来停止右键单击的进程。如果您能展示如何完成此任务,我将不胜感激:

enter image description here

from PyQt4 import QtGui, QtCore
import time
import multiprocessing as mp
poolPbDict=mp.Manager().dict()

def myFunct(inst):
print 'myFunct():', inst.getName(), inst.getPbId(), '\n'
for i in range(110):
for n in range(150000): pass
poolPbDict[ inst.getPbId() ]=i
print '\n\t myFunct(): completed',inst.getName(),inst.getPbId(),poolPbDict[ inst.getPbId() ],'\n'


class PbWidget(QtGui.QProgressBar):
def __init__(self, parent=None, total=20):
super(PbWidget, self).__init__()
self.setMinimum(1)
self.setMaximum(105)
self._active = False
def update_bar(self, argValue):
self.setValue(argValue)
QtGui.qApp.processEvents()
def closeEvent(self, event):
self._active = False

class ProgressBarTree(QtGui.QTreeWidget):
def __init__(self, parent=None):
QtGui.QTreeWidget.__init__(self)
self.items=[]
self.pBars=[]
self.setColumnCount(2)
self.setHeaderLabels(['Name','Progress'])
self.header().setStretchLastSection(True)

def createJobItem(self, inst):
item=QtGui.QTreeWidgetItem()
item.setText(0, inst.getName())
item.setData(1, QtCore.Qt.UserRole, inst)
self.addTopLevelItem(item)

pb=PbWidget()
self.setItemWidget(item, 1, pb)
inst.setPbId(id(pb))

self.items.append(item)
self.pBars.append(pb)

return inst

def getpBars(self):
return self.pBars

class MyObject(object):
def __init__(self, name):
super(MyObject, self).__init__()
self.name = name
self.PbId = None
def setPbId(self, arg):
self.PbId=arg
def getPbId(self):
return self.PbId
def getName(self):
return self.name

class Window(QtGui.QWidget):
def __init__(self):
# declare instances
self.instList=[]
for each in ['One','Two','Three']:
self.instList.append( MyObject(each) )

QtGui.QWidget.__init__(self)
layout = QtGui.QVBoxLayout(self)
self.pbTree = ProgressBarTree()
self.pbTree.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.pbTree.connect(self.pbTree,QtCore.SIGNAL('customContextMenuRequested(QPoint)'),self.showMenu)

self.menu=QtGui.QMenu()
menuItem1=self.menu.addAction('Stop Process')
self.connect(menuItem1,QtCore.SIGNAL('triggered()'),self.stopProc)

layout.addWidget(self.pbTree)
# per instance create progress bar
for inst in self.instList:
inst=self.pbTree.createJobItem(inst)
# button
button=QtGui.QPushButton("Run Processes")
button.clicked.connect(self.runProcs)
layout.addWidget(button)

def showMenu(self, QPos):
parentPosition=self.pbTree.mapToGlobal(QtCore.QPoint(0, 0))
menuPosition=parentPosition+QPos
self.menu.move(menuPosition)
self.menu.show()

def stopProc(self):
print '\n\t stopProc()'

def setup(self, event):
global unpaused
unpaused = event

def runProcs(self):
self.resetBars()
self.event=mp.Event()
self.pool=mp.Pool(2, self.setup, (self.event,))
self.pool.map_async(myFunct, self.instList)
self.event.set()
self.eventListener()
poolPbDict.clear()

def eventListener(self):
global poolPbDict
state=True
while state:
if not poolPbDict:
time.sleep(0.2)
continue
self.updateBars()
check=True
if len(poolPbDict.keys())<len(self.instList):
check=False
for value in poolPbDict.values():
if value<105:
check=False
time.sleep(0.2)
break
if check:
state=False
print '\n\t eventListener() has been stopped \n'
break

def updateBars(self):
global poolPbDict
pBars=self.pbTree.getpBars()
for pb in pBars:
pbId=id(pb)
value=poolPbDict.get(pbId)
if value:
if value>=105:
pb.update_bar(105)
else:
pb.update_bar(value)

def resetBars(self):
for pb in self.pbTree.getpBars():
pb.reset()

if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.resize(600,200)
window.show()
sys.exit(app.exec_())

最佳答案

关于python - 如何在Python中停止单个多处理进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24067231/

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