我是否做得正确?
我的一个客户有一个小组,我正在开发基于Qt的客户端服务器系统,其中包含很多有趣的小部件和套接字。
公司内另一个小组想要使用封装后的QTcpSocket-based客户端数据提供程序类。(它基本上是从服务器向客户端显示器提供数据)
然而,该小组有一个使用MFC构建的巨大应用程序,并且这种情况不会很快改变。Qt-based DLL也是延迟加载的,以便可以在某些配置中部署而不需要此功能。
我已经让它工作了,但它有点hack。目前我的解决方案如下:
DLL包装类构造函数调用QCoreApplication::instance()来查看它是否为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;
然后它将设置一个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);
}
回调函数简单地使用timerID作为类实例的指针来调用processEvents()函数。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(),则可以将 eventTimerInterval 设为 0 并自己调用 BLAHBLAH::processEvents()。
你对此有什么想法?将该应用程序移植到 Qt 不是一种选择。 因为它不是我们的应用程序。
看起来它能工作,但可能违反了几个假设。 我可以像那样使用虚构的参数构造 QCoreApplication 吗?以这种方式操作事件队列是否安全?
我不想以后遇到问题。 有什么想法吗?