Bir GUI uygulamasından bir QThread'i nasıl doğru bir şekilde sonlandırabilirim?

QThread sınıfında self.terminate() 'i ve GUI sınıfında self.thread.terminate() ' ı kullanmayı denedim. Her iki durumda da self.wait() öğesini yerleştirmeyi denedim. Ancak, gerçekleşecek iki senaryo var:

1) İplik hiç bitmiyor ve GUI, iş parçacığının bitmesini beklerken donuyor. İplik bittiğinde, GUI çözülür ve her şey normale döner.

2) İplik gerçekten sonlandırılıyor, ancak aynı zamanda tüm uygulamayı donduruyor.

Ayrıca self.thread.exit() kullanmayı da denedim. Sevinç yok.

Daha fazla açıklığa kavuşturmak için, GUI'de iş parçacığının yürütülmesini herhangi bir zamanda sonlandıracak bir kullanıcı iptal düğmesi uygulamaya çalışıyorum.

Şimdiden teşekkürler.

DÜZENLE:

İşte run() yöntemi:

def run(self):
    if self.create:
        print "calling create f"
        self.emit(SIGNAL("disableCreate(bool)"))
        self.create(self.password, self.email)
        self.stop()            
        self.emit(SIGNAL("finished(bool)"), self.completed)

def stop(self):
     #Tried the following, one by one (and all together too, I was desperate):
     self.terminate()
     self.quit()
     self.exit()
     self.stopped = True
     self.terminated = True
     #Neither works

Ve işte GUI sınıfı 'iş parçacığını iptal etme yöntemi:

def on_abort_clicked(self):
     self.thread = threadmodule.Thread()
     #Tried the following, also one by one and altogether:
     self.thread.exit()
     self.thread.wait()
     self.thread.quit()
     self.thread.terminate()
     #Again, none work
3
Teşekkürler, ama bu gerçekten sorunu çözmeye yardımcı olmuyor.
katma yazar Bo Milanovich, kaynak
Bu kesinlikle aradığım şey değil.
katma yazar Bo Milanovich, kaynak
Not: self.terminate === (self.terminated = true), başka bir şey yok. Tüm uygulamaların% 99'u için.
katma yazar TheHorse, kaynak
İpliği güvenli bir şekilde sonlandırmanın tek bir yolu vardır - tüm işleri bitirmesine izin verin. Bunu yapmak için, zor görevleri yerine getirmeden önce thread.terminated öğesini kontrol etmeniz gerekir.
katma yazar TheHorse, kaynak

1 cevap

QThread :: QHT belgelerine göre sonlandırın:

Uyarı : Bu işlev tehlikelidir ve kullanımı önerilmez.   thread, kod yolundaki herhangi bir noktada sonlandırılabilir. Konu olabilir   veri değiştirilirken sonlandırıldı. İplik için bir şans yok   Ardından kendi kendini temizle, tutulan muteksilerin kilidini aç, vb.   bu işlev yalnızca kesinlikle gerekliyse.

İplik geçirme stratejinizi, örneğin, İpliği bu şekilde sonlandırmaya çalışmak yerine, temiz bir şekilde çıkması için dizeyi işaret etmek üzere QThread :: quit() işlevini kullanın. Aslında thread.exit() işlevini thread içinden çağırmak, run() işlevini nasıl uyguladığınıza bağlı olarak yapmalıdır. İş parçacığı çalıştırma yönteminizin kodunu paylaşmak istiyorsanız, neden işe yaramadığına dair ipucu verebilir.

5
katma
Merhaba teşekkürler. Kodu postaya ekledim.
katma yazar Bo Milanovich, kaynak
Bunu da denedim. Biraz işe yaradı (GUI donmayacaktı, ancak konu da sonlanmayacaktı). Ancak en garip şey oldu. Dizideki tüm def stop (self) kodunu ve GUI'deki def on_abort_clicked (self) kodunu sildim ve yeniden yazdım. İş parçacığının stop() işlevine self.terminate() 'i yerleştirdim ve GUI sınıfında self.thread.stop() ' ı yaptım. Bir cazibe gibi çalışır. AFAIK, denedim ilk şeydi ve daha önce işe yaramadı. Muhtemelen bir şey özledim.
katma yazar Bo Milanovich, kaynak
Hmm. Ve self.create() yönteminin iş parçacığında zaman alan bir yöntem olduğunu varsayıyorum? Genelde, orada ne yapacağınız, self.terminated değilken gibi bir şeydir() {yavaş işlem parçaları yapın ..} . Maalesef Python'u iyi tanımıyorum, ancak bir konu öğretici var gibi görünüyor burada yardım et
katma yazar docsteer, kaynak