相关疑难解决方法(0)

在QThread中启动QTimer

我试图在特定的线程中启动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)

c++ qt multithreading timer qthread

15
推荐指数
3
解决办法
4万
查看次数

Qt信号和插槽,线程,app.exec()和相关查询

[与此问题有关 ]

我写了这段代码来理解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: …

c++ qt signals-slots

7
推荐指数
1
解决办法
1万
查看次数

QTimer线程亲和性

在文档中它说:

在多线程应用程序中,您可以QTimer在任何具有事件循环的线程中使用。要从非 GUI 线程启动事件循环,请使用 QThread::exec(). Qt 使用计时器的线程关联来确定哪个线程将发出信号timeout()。因此,您必须在其线程中启动和停止计时器;不可能从另一个线程启动计时器。

因此,当我有一个QTimer对象时,Qt 使用该对象(或其父级)的线程亲和力来确定哪个线程将发出信号timeout()。但是,当我使用不需要实例的
静态成员函数时,会发生什么情况,哪个线程会发出超时信号呢?singleShot(..)QTimer

qt

2
推荐指数
1
解决办法
1247
查看次数

标签 统计

qt ×3

c++ ×2

multithreading ×1

qthread ×1

signals-slots ×1

timer ×1