【发布时间】:2014-08-10 00:42:57
【问题描述】:
我有一个带有 2 个线程的 Qt5 c++ 应用程序,线程 A 在主程序启动时启动。线程A的start方法运行成功。
到目前为止一切顺利。接下来,在主程序中,我向线程 A 发送一个信号以启动一个 QTimer,它确实如此 - 但该定时器永不过期!
线程 B 处理 tcp 连接。当我启动到我的应用程序的 telnet 连接时,线程 B 启动,突然我看到线程 A 的 Qtimer 以正常间隔到期。
为什么线程 A 的 QTimer 直到线程 B 启动才过期?
我怀疑我的线程搞砸了。请注意产品下面的最后一段代码:
thread of this: QThread(0x200fe00)
thread of timer: QThread(0x1fff470)
这表明我的工作对象(this)与我的计时器对象位于不同的线程中。这个定时器线程地址其实就是MAIN线程。为什么?我很困惑。
建议?
在我的主应用程序中,我像这样创建并启动我的线程:
QThread * MyControllerThread = new QThread(this);
if (MyControllerThread) {
TheController *worker = new TheController(MyControllerThread);
if (worker) {
connect(MyControllerThread, SIGNAL(started()), worker, SLOT(start()));
connect(MyControllerThread, SIGNAL(finished()), worker, SLOT(deleteLater()));
connect(MyControllerThread, SIGNAL(finished()), MyControllerThread, SLOT(deleteLater()));
worker->moveToThread(MyControllerThread);
MyControllerThread->start();
}
在我的主应用程序中,我向新线程发出信号:
emit sig_startlocalpeer(Types::EActionLocalServiceStart); // Move the local peer to standby mode to start remote tests
在我的线程中运行一个插槽(TheController 对象):
connect(&m_remotetestintervaltimer,SIGNAL(timeout()),this,SLOT(expiredRemoteTestIntervalTimer()));
m_remotetestintervaltimer.setTimerType(Qt::VeryCoarseTimer);
m_remotetestintervaltimer.start(REMOTETEST_TIMER_INTERVAL); // Wait between ticks
qDebug() << "thread of this: " << this->thread();
qDebug() << "thread of timer: " << m_remotetestintervaltimer.thread();
【问题讨论】:
-
我已经调用了线程的start()方法。我从哪里调用 run()?我需要两个都打电话吗?
-
能否请您发布一个小代码示例来说明您的问题?
-
因为我创建了 2 个线程,一个主应用程序,并且计时器是在一个插槽中启动的,所以有很多代码要发布。如果没有发布简单的 A-HA 答案,我会发布...但希望避免发布非常大的帖子
-
抱歉,start() 是正确的调用方法。
-
您没有发布足够多的代码来说明问题所在 - 正如您在 cmets 中明确指出的答案之一。这种不完整的问题对其他人没有用处,并且在这里是题外话。我真的强调在问题中发布SSCCE 的重要性。复制、粘贴、(编译、)看是目的。否则,我们会浪费时间向您询问其他不需要的问题,并且您需要更长的时间才能得到答案。因此,您浪费了我们的时间和您自己的时间。这显然适得其反。