问题
I'd like to create a library built on top of QTcpServer
and QTcpSocket
for use in programs that don't have event loops in their main
functions (because the Qt event loop is blocking and doesn't provide enough timing resolution for the real-time operations required).
I was hoping to get around this by creating local event loops within the class, but they don't seem to work unless I've called app->exec()
in the main function first. Is there some way to create local event loops and allow for signal/slot communication within a thread without having an application level event loop?
I've already looked at Is there a way to use Qt without QApplication::exec()? but the answer doesn't help because it seems like the solution adds a local event loop but doesn't remove the application loop.
回答1:
You can create the instance of the QCoreApplication
in a new thread in the library. You should check to create only one instance of it, That's because each Qt application should contain only one 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();
}
}
This way you can use your Qt shared library even in non Qt applications.
来源:https://stackoverflow.com/questions/27801572/is-it-possible-to-create-local-event-loops-without-calling-qapplicationexec