Я делаю это правильно?
У моего клиента есть группа, в которой я разрабатываю Qt-based клиент-сервер с множеством интересных элементов виджета и сокетов.
Другая группа в компании хочет использовать завернутую версию классов поставщика данных клиентских данных на основе QTcpSocket. (Что в основном делает то, что это звучит, предоставляет данные с сервера на клиентские дисплеи)
Однако эта группа имеет огромное приложение, созданное в основном с MFC, и это просто не скоро изменится. DLL на основе Qt также является задержкой загрузки, поэтому ее можно развернуть без этой функции в определенных конфигурациях.
У меня это работает, но это немного взломано. Здесь мое решение в данный момент:
Конструктор класса оболочки DLL вызывает QCoreApplication:: instance(), чтобы узнать, является ли он NULL или нет. Если он равен NULL, он принимает его в приложении, отличном от Qt, и создает экземпляр QCoreApplication собственного:
if (QCoreApplication::instance() == NULL)
{
int argc = 1;
char* argv[] = { "dummy.exe", NULL };
d->_app = new QCoreApplication(argc, argv); // safe?
}
else
d->_app = NULL;
Затем он будет устанавливать таймер окна, чтобы иногда вызвать 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, он игнорирует таймерID, поэтому это выглядит абсолютно корректным.
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 с такими фиктивными аргументами? Безопасна ли очередь событий для работы таким образом?
Я не хочу, чтобы это взорвалось на моем лице позже. Мысли?