2015-01-15 12 views
6

Utworzono bibliotekę sieci opartą na Qt do użytku z aplikacjami, które nie są uruchomione z pętlą zdarzeń Qt i które niekoniecznie są aplikacjami Qt. Było to możliwe poprzez utworzenie instancji QCoreApplication w wątku na odpowiedź od Is it possible to create local event loops without calling QApplication::exec()?Usunięcie ostrzeżenia "Aplikacja QApplication nie została utworzona w wątku głównym()"

Działa to doskonale, ale to sprawia, że ​​Qt zdenerwowany (przypuszczam, że martwi się, że będę próbować manipulować GUI poza głównym wątku nie zadziałałoby, ale ja nie), a więc wyświetla ostrzeżenie: WARNING: QApplication was not created in main() thread.

Chciałbym ukryć ostrzeżenie, które w przeciwnym razie zostanie wydrukowane na konsoli X11 i najprawdopodobniej spowoduje, że moi użytkownicy wprowadzą mnóstwo zbędnych braków. Chciałbym jednak po prostu tłumaczyć błąd THIS, ponieważ używam qDebug dla niektórych legalnych celów i chcę zobaczyć przyszłe ostrzeżenia. Czy istnieje sposób, aby to zrobić, jak jakiś Qt #pragma?

EDIT:

Podobny pytano zanim tutaj: Qt console application "WARNING: QApplication was not created in the main() thread", ale odpowiedź była w zasadzie tylko przegląd kod bez żadnych sensownych pomysłów tłumić ostrzeżenie.

+1

Myślę, że problem powstaje, ponieważ dotykasz API Qt (w głównym wątku lub po prostu * w * wątku) przed utworzeniem QApplication. Nie możesz tego zrobić (rzeczy modulo, które powinny zostać wykonane przed QApplication). W szczególności tworzysz obiekty QObjects. – peppe

+0

hmm, co tworzy interesujący problem z jajkami kurzymi, ponieważ klasa, której używam do stworzenia wątku 'QCoreApplication', sama jest' obiektemObiektu', ponieważ musi używać sygnałów do komunikowania się z gniazdami w wątkach potomnych. –

+1

Cóż, po prostu podzielić? Zachowaj tę klasę za pomocą logiki i utwórz kolejną klasę, która tworzy QCoreApplication AND obiekt twojej klasy. – peppe

Odpowiedz

8

Problem pojawia się, ponieważ dotykasz API Qt (w głównym wątku lub po prostu w jakiś wątek) przed utworzeniem QApplication. Nie możesz tego zrobić. W szczególności, tworzysz QObject pewnego rodzaju, który ustawia gdzieś w Qt to, co sam Qt powinien uznać za wątek main.

Jedynymi API Qt, z których można korzystać przed utworzeniem aplikacji QApplication, są te, które są w sposób wyraźny udokumentowane, aby były bezpieczne w tym scenariuszu.

Więc: nie rób tego. Zbuduj QCoreApplication jako pierwszą rzecz,, wtedy możesz odejść.

+0

Refaktoryzacja mojego kodu w tej formie rozwiązała również wiele dziwnych i sporadycznych problemów, które miałem z połączeniami między obiektami w różnych wątkach. Zdecydowanie nie będę ignorować tego ostrzeżenia. –

Powiązane problemy