2010-07-09 8 views
8

engelleme LoadImage() 'ı çağıran düğmeyi tıklatırım, UI yanıt vermiyor. Periyodik olarak "ping" mesajını debug çıkışı olarak görüyorum ancak UI kilitleniyor, hiçbir şeye tepki vermiyor. İş parçacığım neden ayrı ayrı çalışmıyor? CameraThread, public QThread 'dan türetilmiştir. Qb kitaplıkları ve Ubuntu 10.04 (x86) depolarından QT Creator ile birlikte gcc sürüm 4.4.3 (Ubuntu 4.4.3-4ubuntu5) kullanıyorum.QThread bir iş parçacığı başlayarak bir düğme için bir yuvası vardır, basit bir formu UI sahip ana uygulama

cevap

27

Kısa cevap (bir neden olmadan) korunur: değil run()aThread->start(); arayarak iplik başlayın ve en koşmak iplik emin() yöntemi korunmaktadır (kamu değil). Bu öncelikli zamanlama sağlar ve gerçekte kendi iplik bağlamında run() yöntem çalıştırır olarak

açıklama

Calling start() is the correct way, iplik başlatın.

Size bu iplik görüntüleri yükleme olacak, bu yüzden tuzaklar içine çalıştırmadan önce bazı ipuçları şunlardır gidiyorum gibi görünüyor

birçok kişi

  1. QThread kendisi değil QThread

    kullanırken düşmek Bir iş parçacığı.
    Bu bir iplik etrafında sarıcı bu .. bize getiriyor olduğunu
  2. sinyaller/CameraThread sınıfında tanımlanan yuvaları ille ondan denilen sadece koşmak() yöntemini ve yöntemleri hatırlamak parçacığının bağlamda aday olmayacak ayrı bir iş parçacığında çalışıyorlar.

IMHO, vakaların çoğunluğunda yılında QThread sınıflara gitmek için yol değil olduğunu. Aşağıdaki kod ile çok daha basit yapabilirsiniz ve size birçok baş ağrısı kurtaracaktır.

Ayrıca bu konuyla ilgili Qt blog numaralı makaleyi okuyun.

+0

QT belgeleri, QThread'in alt sınıflara göre kullanımını açıklar. Neden bu kötü bir fikir? –

+1

@Atilla - Casey'nin cevabında QT Blog bağlantısını okursanız, "Yanlış yapıyorsunuz" başlıklı başlıkta bulabilirsiniz. QThread'in alt sınıflaması hakkındaki QT belgelerinin neden iş parçacığı yapmak için doğru bir yol olmadığıyla ilgili bir tartışma.Ayrıca, blog girişini doğru bir şekilde okursam, orijinal Qt belgelerini yazan kişi tarafından yazılır. –

+2

Evet, bu doğru. Temel olarak, Qt belgeleri yanıltıcıdır ve sonuç olarak, birçok kişinin hacky şeyleri yapmalarına yol açmıştır (Qthread yapıcısında movetoThread (bu) gibi) ve bu da hattın aşağısında sorunlara neden olur. Umarım dokümanlar yakında güncellenir. – Casey

4

Thread-> start() 'ı çağırmanız gerekir. Çalışmıyor ... run, thread için bir giriş noktasıdır. Konu başlangıç ​​ile başlatıldı. Doğrudan koş dediniz, bu yüzden gui'nizi engelliyorsunuz. QThread belgelerini kontrol edin. Sanal hükümsüz QThread :: run()

-1

Sorunun, QtCore.QThread._init __ (self) yapıcısını çağırmamanız olabileceğini düşünüyorum. Bende aynı sorun vardı. Ayrıca, başlangıç ​​işlevini geçersiz kılmamalısınız, run() işlevini geçersiz kılmalısınız. Bu, sahip olduğum aynı sorunu çözdü. Herhangi bir uyku() gecikmesi olmadan bile, pencere yanıt vermelidir.

+1

Hayır, benim sorunum run() yerine çağırıyordu başlangıç ​​(). Zaten koşmayı geçersiz kıldım(). –

İlgili konular