Использование библиотеки на основе Qt в не-Qt-приложении
Я делаю это правильно?
У моего клиента есть группа, в которой яЯ разрабатываю основанные на Qt клиент-серверные вещи с множеством забавных вещей для виджетов и сокетов.
Другая группа в компании хочет использовать упакованную версию классов провайдеров клиентских данных на основе QTcpSocket. (Что делает в основном то, на что это похоже, предоставляет данные с сервера на клиентские дисплеи)
Однако у этой группы есть огромное приложение, построенное в основном из MFC, и это просто не изменится в ближайшее время. DLL-библиотека на основе Qt также загружается с задержкой, поэтому ее можно развернуть без этой функции в определенных конфигурациях.
у нас это работает, но этонемного хакерский Вот'Мое решение на данный момент:
Конструктор класса оболочки DLL вызывает QCoreApplication :: instance (), чтобы проверить,S NULL или нет. Если оно'NULL, это предполагаетs в приложении, отличном от Qt, и создает его экземпляр QCoreApplication 's собственной:
if (QCoreApplication::instance() == NULL)
{
int argc = 1;
char* argv[] = { "dummy.exe", NULL };
d->_app = new QCoreApplication(argc, argv); // safe?
}
else
d->_app = NULL;
Затем он настроит таймер Windows для периодического вызова processEvents ():
if (eventTimerInterval > 0)
{
// STATE: start a timer to occasionally process the Qt events in the event queue
SetTimer(NULL, (UINT_PTR)this, eventTimerInterval, CDatabaseLayer_TimerCallback);
}
Обратный вызов просто вызывает функцию processEvents (), используя timerID в качестве указателя на экземпляр класса. Документы SetTimer () говорят, что когда HWND равен NULL, он игнорирует timerID, так что это выглядит совершенно корректно.
VOID CALLBACK BLAHBLAH_TimerCallback(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
((BLAHBLAH*)idEvent)->processEvents(); // basically just calls d->_app->processEvents();
}
Затем я уничтожаю экземпляр QCoreApplication как самую последнюю вещь в деструкторе.
BLAHBLAH::~BLAHBLAH()
{
.. other stuff
QCoreApplication* app = d->_app;
d->_app = NULL;
delete d;
if (app != NULL)
delete app;
}
Если хост-приложение желает синхронизировать вызовы самого processEvents (), оно может передать 0 для eventTimerInterval и вызвать BLAHBLAH :: processEvents ().
Есть мысли по этому поводу? Портирование этого приложения на Qt не вариант. Это'не наши.
Кажется, это работает, но, возможно, здесь нарушено несколько предположений. Могу ли я просто создать QCoreApplication с фиктивными аргументами, подобными этому? Безопасно ли работать таким образом в очереди событий?
Я нене хочу, чтобы это взорвалось мне в лицо позже. Мысли?