我试图在特定的线程中启动QTimer.但是,计时器似乎没有执行,也没有打印出来.是与计时器,插槽还是线程有关?
main.cpp中
#include "MyThread.h"
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
MyThread t;
t.start();
while(1);
}
Run Code Online (Sandbox Code Playgroud)
MyThread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QTimer>
#include <QThread>
#include <iostream>
class MyThread : public QThread {
Q_OBJECT
public:
MyThread();
public slots:
void doIt();
protected:
void run();
};
#endif /* MYTHREAD_H */
Run Code Online (Sandbox Code Playgroud)
MyThread.cpp
#include "MyThread.h"
using namespace std;
MyThread::MyThread() {
moveToThread(this);
}
void MyThread::run() {
QTimer* timer = new QTimer(this);
timer->setInterval(1);
timer->connect(timer, SIGNAL(timeout()), this, SLOT(doIt()));
timer->start();
}
void MyThread::doIt(){
cout …Run Code Online (Sandbox Code Playgroud) [与此问题有关 ]
我写了这段代码来理解qt信号和插槽是如何工作的.我需要有人来解释这种行为,并告诉我,我对自己的结论是否正确.
我的节目:
connectionhandler.h
#ifndef CONNECTIONHANDLER_H
#define CONNECTIONHANDLER_H
#include <QTcpServer>
class ConnectionHandler : public QObject
{
Q_OBJECT
public:
ConnectionHandler();
public slots:
void newConn();
private:
QTcpServer *server;
};
#endif // CONNECTIONHANDLER_H
Run Code Online (Sandbox Code Playgroud)
connectionhandler.cpp
#include "connectionhandler.h"
#include <QTextStream>
ConnectionHandler::ConnectionHandler() {
server = new QTcpServer;
server->listen(QHostAddress::LocalHost, 8080);
QObject::connect(server, SIGNAL(newConnection()),this, SLOT(newConn()));
}
void ConnectionHandler::newConn() {
QTextStream out(stdout);
out << "new kanneksan!\n";
out.flush();
}
Run Code Online (Sandbox Code Playgroud)
main.cpp
#include <QCoreApplication>
#include "connectionhandler.h"
int main(int argc, char* argv[]) {
QCoreApplication app(argc,argv);
ConnectionHandler handler;
return app.exec();
}
Run Code Online (Sandbox Code Playgroud)
现在,运行此程序会将其发送到无限循环中以查找新连接.
Observation: …
在文档中它说:
在多线程应用程序中,您可以
QTimer在任何具有事件循环的线程中使用。要从非 GUI 线程启动事件循环,请使用QThread::exec(). Qt 使用计时器的线程关联来确定哪个线程将发出信号timeout()。因此,您必须在其线程中启动和停止计时器;不可能从另一个线程启动计时器。
因此,当我有一个QTimer对象时,Qt 使用该对象(或其父级)的线程亲和力来确定哪个线程将发出信号timeout()。但是,当我使用不需要实例的
静态成员函数时,会发生什么情况,哪个线程会发出超时信号呢?singleShot(..)QTimer