...从静态类和非主线程调用。简而言之,我有一个类“sapp”,它有另一个静态类“tobj”作为静态成员。为了避免静态订单初始化失败,tobj 在 sapp 的方法中声明,该方法又返回 tobj 实例的指针。我的问题是, tobj 有一个应该在构造函数中启动的计时器,并且 tobj 可能由非主线程创建。QTimer 不能由主线程以外的线程启动(或者我猜是没有事件循环的线程)。出于这个原因,我通过 QMetaObject::invokeMethod + Qt::QueuedConnection 调用 QTimer::start 以避免线程问题,但是它不起作用,QTimer::start 永远不会被调用。我调查了一下这个问题,看起来,QTimer::start 没有被调用,因为 QTimer' s parent(在这种情况下为 tobj)被声明为静态的。如果我将 tobj 声明为非静态成员,则一切正常。
我不太了解 Qt 的内部结构,这可能是一个错误还是我做错了什么?
这是代码:
class tobj : public QObject
{
Q_OBJECT
QTimer timer;
private slots:
void timeout();
public:
tobj();
};
class sapp : public QObject
{
Q_OBJECT
public:
static tobj* f();
};
void tobj::timeout()
{
qDebug() << "hi";
}
tobj::tobj()
{
connect(&timer, SIGNAL(timeout()), this, SLOT(timeout()));
timer.setInterval(500);
qDebug() << QMetaObject::invokeMethod(&timer, "start", Qt::QueuedConnection); // returns true, but never invoked.
}
tobj* sapp::f()
{
static tobj ff;
return &ff;
}
这是测试项目的链接,包含 1 个标头和 1 个 cpp 文件http://dl.dropbox.com/u/3055964/untitled.zip
我正在 Qt 4.8.0 和 MSVC 2010 上进行测试。
非常感谢,非常感谢您的帮助。