Qt每隔一秒创建一个新线程

Qt new thread are created every tick?

本文关键字:一个 新线程 线程 一秒 Qt 创建      更新时间:2023-10-16

为什么每次QTimer都会创建一个新线程?我的应用程序需要尽可能长时间地运行,但是在xx个滴答之后,它冻结了,它仍然在运行(它正在响应),但是下一个滴答没有执行。我查看了调试信息,我看到:

QThread::start: Failed to create thread () QThread::start: Failed toQThread::start: Failed to create thread ()QThread::start: Failed to create thread () QThread::start: Failed toQThread::start: Failed to create thread ()QThread::start: Failed to create thread () QThread::start: Failed to创建线程

waat吗?

Tick每xx秒执行一次,信号位于QWidged(这是TabWidget的一个选项卡)

namespace Ui {
class accountTab;
}
class accountTab : public QMainWindow
{
    Q_OBJECT
public:
    explicit accountTab(QWidget *parent = 0);
    class player *_player;
    ~accountTab();
private slots:
    void on_clean_timer_clicked();
public:
    Ui::accountTab *ui;
};

void accountTab::on_clean_timer_clicked()
{
    if(user->timers.value("clean")->isActive()) {
        _player->timers.value("clean")->stop();
    }
    else if(!user->timers.value("clean")->isActive()) {
        _player->timers.value("clean")->start(1800000); //900000
    }
}

_player是一个简单的类。_player->clean()执行一些静态类,这些类是try/catch的。

player.h

class player : public QObject
{
    Q_OBJECT
public:
    player();
    ~player();
    player(Ui::accountTab *tab, std::string login, std::string password);
    player(Ui::accountTab *tab, User user);
public:
    bool logIn();
    Ui::accountTab *tab = new Ui::accountTab();
public slots:
    void clean();
private:
    User user;
    QMap<std::string, QTimer*> timers;
    void initializeTimers();
};

player.cpp

player::player(Ui::accountTab *tab, std::string login, std::string password)
{
    this->tab = tab;
    this->user.login = login;
    this->user.password = password;
}
player::~player()
{
    delete this->manager;
    delete this->tab;
}
bool player::logIn()
{
    ...
    Log::writeLog("Login completed!", *this);
    return true;
}
bool player::setup(bool saved, bool save)
{
    if(!this->logIn())
        return false;
    Packets::sendPacket("getSimulation", *this);
    this->initializeTimers();
    return true;
}
void player::initializeTimers()
{
    this->timers.insert("clean", new QTimer(this));
    connect(this->timers.value("clean"), SIGNAL(timeout()), this, SLOT(cleanZoo()));
}
void player::clean()
{
    Packets::sendPacket()
}

玩家类中的用户类保留登录名和密码。计时器是QMap: QMap计时器;sendPacket()是静态的

和sendPacket ()

QString httpManager::sendPacket()
{
    QNetworkRequest request("https://www.google.pl/");
    if(headers.size() > 0) {
        for (QMap<const char*, const char*>::iterator i = headers.begin(); i != headers.end(); ++i)
            request.setRawHeader(i.key(), i.value());
    }
    QNetworkAccessManager *manager = new QNetworkAccessManager();
    manager->setCookieJar(this->cookies);
    QNetworkReply *reply = manager->get(request);
    QEventLoop loop;
    QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();
    QList<QNetworkCookie> cookies = reply->manager()->cookieJar()->cookiesForUrl(QUrl(reply->url()));
    foreach(QNetworkCookie cookie, cookies)
    {
        this->cookies->insertCookie(cookie);
    }
    return reply->readAll().data();
}

QEventLoop被执行以在同一个void中获得响应。这会产生新的线程吗?

这里有一些错误:

  1. 你的应用程序应该有一个所有代码使用的QNetworkAccessManager,不要为每个调用创建一个,在main中创建一个并将其传递到需要的地方。

  2. 您需要按照手册中的说明使用deleteLater删除QNetworkReply

  3. 在函数中创建另一个事件循环通常不是一个好主意。

  4. 在连接QNetworkAccessManager::finished(QNetworkReply * reply)信号的类httpManager上创建一个插槽,读取应答并从这里调用deleteLater