Portál AbcLinuxu, 12. května 2025 04:44

Dotaz: pyQT4 a QThread

1.7.2007 10:50 pepik | skóre: 16 | blog: nevim | Chlumec nad Cidlinou
pyQT4 a QThread
Přečteno: 613×
Odpovědět | Admin
Používám standartní funkci Thread, která je v modulu pro Python. Můj program zobrazuje GUI s progressbarem a zároveň spouštím druhé vlákno, které provádí náročnější operaci a průběh zobrazuje v progressbaru. Fungovalo to, ovšem pouze někdy. Tak z 80% jsem dostal SIGSEGV nebo jinou chybu. Zajímavé je, že občas to proběhlo bez chyby. Našel jsem, že pro tyto účely mám použít QThread. Ovšem nechápu jejich použití. Angličtinu louskám celkem blbě. Proto se ptám, jak je mám použít? Jako nové vlákno mám zpouštět GUI, nebo fci, která ovládá GUI? Byl bych rád, kdyby sem někdo hodil kus jednoduchého kódu. Zkoušel jsem s tím laborovat, ale nikdy se mi žádnou fci nepodařilo spustit jako vlákno.
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

1.7.2007 11:59 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: pyQT4 a QThread
Odpovědět | | Sbalit | Link | Blokovat | Admin
Program v Pythonu, co dostane SIGSEGV? Ukaž ho, to se musí hlásit.
1.7.2007 13:15 hanzz | skóre: 19 | blog: hanzz
Rozbalit Rozbalit vše Re: pyQT4 a QThread
Odpovědět | | Sbalit | Link | Blokovat | Admin
Dve tridy... Jedna je samotny thread, druhe je progressdialog
from PyQt4 import QtCore, QtGui
import time,sys
# vytvoreni mutexu
mutex=QtCore.QMutex()

class thread(QtCore.QThread):
	"""
	Thread, ktery co sekundu posune progress dialog o jeden stupen, dokud nebude na 100
	"""
	def __init__(self):
		QtCore.QThread.__init__(self,None)

	def run(self):
		"""
		Funkce, ktera je spustena po zapnuti threadu funkci start()
		"""
		# automaticke lockovani threadu pri praci s promennyma mimo tento thread
		locker = QtCore.QMutexLocker(mutex)
		i=0 # pocitadlo sekund
		while i!=1000:
			# ukonceni threadu pokud v progressDialogu zmenime promennou end na true
			if win.end==True:
				break
			time.sleep(0.1)
			i+=1
			# emitovani signalu, na ktery je progressDialog napojen
			self.emit(QtCore.SIGNAL("inc(int)"), i)

class progress(QtGui.QProgressDialog):
	"""
	Derivovana trida progress dialogu
	"""
	def __init__(self):
		"""
		Vytvori a spusti thread a progressDialog
		"""
		QtGui.QProgressDialog.__init__(self,"Test dialogu","Zrusit",0,1000)
		self.setWindowModality(QtCore.Qt.WindowModal)
		# signaly potrebne k ukonceni threadu pri uzavreni okna a kliknuti na tlacitko pro ukonceni dialogu
		QtCore.QObject.connect(app,QtCore.SIGNAL("lastWindowClosed() "),self._exit)
		QtCore.QObject.connect(self,QtCore.SIGNAL("canceled() "),self._exit)
		# vytvoreni threadu pomoci tridy thread()
		self.thread=thread()
		self.end=False
		# napojeni signalu pro zvednuti stavu progressbaru na fci progressDialogu setValue(int)
		QtCore.QObject.connect(self.thread, QtCore.SIGNAL("inc(int)"), self.setValue,QtCore.Qt.QueuedConnection)
		# zapnuti threadu
		self.thread.start()
	
	def _exit(self):
		"""
		Vypnuti threadu
		"""
		self.end=True
		self.thread.wait()
		app.quit()

app = QtGui.QApplication(sys.argv)
win=progress()
win.show()
sys.exit(app.exec_())

1.7.2007 16:05 pepik | skóre: 16 | blog: nevim | Chlumec nad Cidlinou
Rozbalit Rozbalit vše Re: pyQT4 a QThread
Díky za pomoc.
kozzi avatar 1.7.2007 13:37 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: pyQT4 a QThread
Odpovědět | | Sbalit | Link | Blokovat | Admin
No já si myslím s thread funkcemi hrál jak u pythonu tak i s těmi z Qt, ale proto co potřebuješ ty by bylo možná lepší použít QTimer je to jednoduší na pochoponí a jsou stím menší potíže. Obecně řečeno vlákna jsou dobrá, ale musejí se dobře použít.
Linux je jako mušketýři "jeden za všechny, všichni za jednoho"

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.