Ich hab ein kleines Problem und zwar überlagert das "finished" Signal das "terminated" Signal des QThread.
Wenn ich nun auf Abort drücke, wird der Thread mit QThread::terminate() abgeschossen, aber das Signal finished() und terminated() ausgelöst, wobei das finished() Signal, terminated() überlagert und deshalb dann die Funktion self.onFinish() ausgelöst wird anstelle von self.onAbort().
Kann man das irgendwie zurecht biegen? :/
Btw. Wenn ich die Zeile "self.connect(self.thread, QtCore.SIGNAL('finished()'), self.onFinish)" auskommentiere funzt das terminated() Signal wie es sollte :/
Code: Alles auswählen
# Signal and Slots for QThread
self.connect(self.buttonBox.button(QtGui.QDialogButtonBox.Abort), QtCore.SIGNAL('clicked()'), self.thread.terminate)
self.connect(self.thread, QtCore.SIGNAL('terminated()'), self.onAbort)
self.connect(self.thread, QtCore.SIGNAL('finished()'), self.onFinish)
self.thread.dataWritten.connect(self.progressBar.setValue)
self.thread.currentPass.connect(self.labelPasses.setText)
def onAbort(self):
self.progressBar.setValue(self.size)
self.progressBar.setFormat('Aborted')
def onFinish(self):
self.progressBar.setValue(self.size)
self.progressBar.setFormat('succsessfully completet')
class Thread(QtCore.QThread):
dataWritten = QtCore.pyqtSignal(int)
currentPass = QtCore.pyqtSignal(str)
def __init__(self, algo, device, size):
QtCore.QThread.__init__(self)
self.algo = algo
self.device = device
self.size = size
def run(self):
stat = 0
f = open(self.device, 'wb')
for method in self.algo:
if method == 'random':
data = urandom(1000)
else:
data = method * 256
for i in xrange(self.size): # not Python 3000 compatible (range)
f.write(data)
self.dataWritten.emit(i)
f.seek(0)
stat +=1
self.currentPass.emit(str(stat)+'/'+str(len(self.algo)))
f.close()