是否可以在不调用 QApplication::exec() 的情况下创建本地事件循环?
Is it possible to create local event loops without calling QApplication::exec()?
我想创建一个基于 QTcpServer
和 QTcpSocket
的库,用于 main
函数中没有事件循环的程序(因为Qt 事件循环处于阻塞状态,无法为所需的实时操作提供足够的时间分辨率。
我希望通过在类中创建本地事件循环来解决这个问题,但它们似乎不起作用,除非我先在主函数中调用 app->exec()
。有没有什么方法可以创建本地事件循环并允许 signal/slot 在线程内进行通信而无需应用程序级事件循环?
我已经看过 Is there a way to use Qt without QApplication::exec()? 但答案没有帮助,因为该解决方案似乎添加了本地事件循环但没有删除应用程序循环。
您可以在库的新线程中创建 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 共享库。
我想创建一个基于 QTcpServer
和 QTcpSocket
的库,用于 main
函数中没有事件循环的程序(因为Qt 事件循环处于阻塞状态,无法为所需的实时操作提供足够的时间分辨率。
我希望通过在类中创建本地事件循环来解决这个问题,但它们似乎不起作用,除非我先在主函数中调用 app->exec()
。有没有什么方法可以创建本地事件循环并允许 signal/slot 在线程内进行通信而无需应用程序级事件循环?
我已经看过 Is there a way to use Qt without QApplication::exec()? 但答案没有帮助,因为该解决方案似乎添加了本地事件循环但没有删除应用程序循环。
您可以在库的新线程中创建 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 共享库。