2015-01-06 4 views
5

Я хотел бы создать библиотеку, построенную поверх QTcpServer и QTcpSocket для использования в программах, которые не имеют циклов событий в своих функциях main (поскольку цикл событий Qt блокируется и не обеспечивает достаточного разрешения времени для требуются операции реального времени).Можно ли создавать локальные циклы событий без вызова QApplication :: exec()?

Я надеялся обойти это, создав локальные циклы событий внутри класса, но они, похоже, не работают, если я не позвонил app->exec() в первую функцию. Есть ли способ создать локальные циклы событий и разрешить связь сигнала/слота в потоке без наличия цикла событий на уровне приложения?

Я уже посмотрел Is there a way to use Qt without QApplication::exec()?, но ответ не помогает, потому что похоже, что решение добавляет локальный цикл событий, но не удаляет цикл приложения.

+0

порождает новый поток, который имеет 'QApplication :: exec()' и сохраняет его в качестве «основного потока»? –

+0

Я попробую. Единственным недостатком является то, что даже если это работает, вероятно, это исключает возможность использования библиотеки в будущем с использованием реальных приложений Qt, поскольку вы, разумеется, не можете иметь два вызова 'QApplication :: exec' –

ответ

6

Вы можете создать экземпляр QCoreApplication в новом потоке в библиотеке. Вы должны проверить, чтобы создать только один экземпляр этого, Это потому, что каждое приложение Qt должен содержать только один QCoreApplication:

class Q_DECL_EXPORT SharedLibrary :public QObject  
{ 
Q_OBJECT 
public: 
    SharedLibrary(); 

private slots: 

    void onStarted(); 

private: 
    static int argc = 1; 
    static char * argv[] = {"SharedLibrary", NULL}; 
    static QCoreApplication * app = NULL; 
    static QThread * thread = NULL; 
}; 


SharedLibrary::SharedLibrary() 
{ 
    if (thread == NULL) 
    { 
     thread = new QThread(); 
     connect(thread, SIGNAL(started()), this, SLOT(onStarted()), Qt::DirectConnection); 
     thread->start(); 
    } 
} 
SharedLibrary::onStarted() 
{ 
    if (QCoreApplication::instance() == NULL) 
    { 
     app = new QCoreApplication(argc, argv); 
     app->exec(); 
    } 
} 

Таким образом, вы можете использовать Qt совместно библиотеку даже в не приложениях Qt.

+1

и, возможно, синхронизировать при проверке и запуске цикла –

+2

Это заслуживает дополнительного +1 для проверки 'QCoreApplication :: instance()' –

+0

@NicolasHolthaus Хорошая точка. Я сделал это для вас. – Tay2510

Смежные вопросы