...静的クラスと非メインスレッドから呼び出されます。要するに、私は静的メンバーとして別の静的クラス "tobj"を持つ "sapp"クラスを持っています。静的な順序の初期化の失敗を避けるために、tobjはsappのメソッドの中で宣言され、sappのメソッドはtobjのインスタンスのポインタを返します。 私の問題は、tobjにはコンストラクタで開始されるべきタイマーがあり、tobjは非メインスレッドによって作成されることです。 QTimerは、メインスレッド以外のスレッド(または、私が推測するイベントループを持たないスレッド)で起動することはできません。そのため、私はQMetaObject :: invokeMethod + Qt :: QueuedConnection経由でQTimer :: startを呼び出してスレッドの問題を回避しますが、動作しません.QTimer :: startは呼び出されません。 QTimerの親(この場合はtobj)が静的として宣言されているため、QTimer :: startは呼び出されません。私がtobjを非静的メンバーとして宣言すれば、すべて正常に動作します。QMetaObject :: invokeMethodが動作しないとき...
私は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;
}
ここで私はQtの4.8.0とMSVC 2010年にテストしています1つのヘッダーから成るテストプロジェクトへのリンク、および1つのcppファイルhttp://dl.dropbox.com/u/3055964/untitled.zip
だ
ありがとうございました。ご協力いただきありがとうございます。