2014-07-02 18 views
-1

为什么QTimer的每个时钟都会创建新的线程?我的应用程序需要尽可能长时间运行,但是在蜱的xx冻结之后,它仍然在运行(它正在响应),但是下一个蜱不会执行。我看着调试信息,我看到:Qt新线程是否每次打勾创建?

的QThread ::开始:无法创建线程()的QThread ::开始:无法创建 ()线程的QThread ::开始:无法创建线程() QThread的::开始:无法创建线程()的QThread ::开始:无法创建 ()线程的QThread ::开始:无法创建线程() 的QThread ::开始:无法创建线程()的QThread ::启动:未能 创建线程()

waat?

蜱每隔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/catched。

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()是

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执行得到在同一无效响应静态无效

和功能sendpacket()。这是否创建新线程?

+6

QTimer不会创建任何线程,你的情况别的东西一样。此外,它看起来像你已经发布了一些无关的代码(我没有在这里看到任何计时器)。 – Archie

+0

我的不好,我更新了代码,你可以再检查一次吗? –

+1

定时器运行发送数据包的代码,并> user1095108

回答

1

有几件事错在这里:

  1. 您的应用程序应该有所有的代码使用,不创建一个针对每个呼叫,创建一个在main并传递给它一个QNetworkAccessManager是必要的。

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

  3. 创建函数中的另一事件循环一般是不是一个好主意。建立在连接到QNetworkAccessManager::finished(QNetworkReply * reply)信号类httpManager插槽,阅读答复,并从这里调用deleteLater

相关问题