Можно ли создавать локальные циклы событий без вызова QApplication :: exec ()?

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

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

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

7

Решение

Вы можете создать экземпляр 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-приложениях.

7

Другие решения


По вопросам рекламы [email protected]