Я хотел бы создать библиотеку на основе QTcpServer
а также QTcpSocket
для использования в программах, в которых нет циклов событий main
функции (потому что цикл событий Qt блокирует и не обеспечивает достаточного временного разрешения для требуемых операций в реальном времени).
Я надеялся обойти это, создавая локальные циклы событий внутри класса, но они, кажется, не работают, если я не позвонил app->exec()
в основной функции первым. Есть ли какой-нибудь способ создания локальных циклов событий и обеспечения связи сигнал / слот в потоке без цикла событий уровня приложения?
Я уже посмотрел на Есть ли способ использовать Qt без 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-приложениях.