2015-01-15 22 views
6

Qt tabanlı bir ağ kitaplığı oluşturdum ve Qt olay döngüsü çalıştırmıyor ve Qt uygulamalarının olması gerekmez. Bu Is it possible to create local event loops without calling QApplication::exec()? Bu mükemmel çalışıyor"Uyarı", ana() iş parçacığı içinde oluşturulmadı "

dan Yanıt başına bir iş parçacığı bir QCoreApplication örneğini oluşturarak mümkün kıldı, ama Qt üzgün (bunu ben ana iş parçacığı dışında bir GUI manipüle çalışacağımız anlamına endişeli tahmin yapar hangi işe yaramaz, ama ben değilim) ve bu yüzden bir uyarı yazdırır: WARNING: QApplication was not created in main() thread.

Aksi takdirde X11 konsoluna yazdırılacak ve büyük olasılıkla kullanıcılarımın bir grup gereksiz boşluğa girmesine neden olacak uyarıyı bastırmak istiyorum. Ancak, bazı meşru amaçlar için qDebug kullanıyorum ve gelecekteki uyarıları görmek istiyorum, sadece THIS hatasını kaldırmak istiyorum. Bunu yapmanın bir yolu var mı, bir çeşit Qt #pragma?

DÜZENLEME: Qt console application "WARNING: QApplication was not created in the main() thread", ama cevap uyarıyı bastırmak için anlamlı bir fikir olmadan temelde sadece bir kod incelemesi oldu:

Benzer bir soru önce burada istendi.

+1

QApplication oluşturmadan önce Qt API'lerine (ana iş parçacığında veya yalnızca * bazı * iş parçacığına) dokunduğunuz için sorunun ortaya çıktığını düşünüyorum. Bunu yapamazsınız (QApplication'dan önce yapılması gereken modüller). Özellikle, QObjects oluşturuyorsunuz. – peppe

+0

hmm, bu ilginç bir tavuk-yumurta problemi yaratıyor çünkü 'QCoreApplication' iş parçacığı oluşturmak için kullandığım sınıfın kendisi bir "QObject" çünkü çocuk iş parçacıklarındaki yuvalarla iletişim kurmak için sinyaller kullanması gerekiyor. –

+1

Peki, sadece bölmek mi? Bu sınıfı mantıkla koruyun ve QCoreApplication AND sınıfınızın bir nesnesini oluşturan başka bir sınıf oluşturun. – peppe

cevap

8
Sorun, QApplication oluşturmadan önce Qt API'lerine (ana iş parçacığında veya yalnızca bazı iş parçacığına) dokunduğunuz için ortaya çıkar. Bunu yapamazsın. Özellikle, bir QObject türünde bir QObject oluşturuyorsunuz, Qt içinde bir yere ayarlıyor Qt kendisi main iş parçacığı olarak düşünmelisiniz.

QApplication oluşturmadan önce kullanabileceğiniz tek Qt API'ları, bu senaryoda güvenli olması için açık bir şekilde belgelendirilmiş olanlardır.

Yani: bunu yapma. İlk şey olarak bir QCoreApplication oluşturun, o zaman gitmek için özgürsünüz.

+0

Kodumun bu formda yeniden kodlanması, farklı iş parçacıklarındaki nesneler arasındaki bağlantılarda sahip olduğum çok sayıda garip ve aralıklı sorunu da çözdü. Bu uyarıyı kesinlikle göz ardı etmeyeceğim. –

İlgili konular