Qt每隔一秒创建一个新线程
Qt new thread are created every tick?
为什么每次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中获得响应。这会产生新的线程吗?
这里有一些错误:
-
你的应用程序应该有一个所有代码使用的
QNetworkAccessManager
,不要为每个调用创建一个,在main
中创建一个并将其传递到需要的地方。 -
您需要按照手册中的说明使用
deleteLater
删除QNetworkReply
-
在函数中创建另一个事件循环通常不是一个好主意。
在连接
QNetworkAccessManager::finished(QNetworkReply * reply)
信号的类httpManager
上创建一个插槽,读取应答并从这里调用deleteLater
。- 如何检查第三个 API 是否在 Linux 中为 c/c++ 程序创建了一个新线程?
- Zmq 上下文 - 我应该在新线程中创建另一个上下文吗?
- 创建一个没有父级的新Qt窗口是否也会创建一个新线程
- 如何使一个方法在新线程中调用同一类中的另一个方法
- 最少的工作量值得生成一个新线程
- 使用Qt4.8中的C创建一个新线程
- OpenMP - 在每次循环迭代中启动一个新线程
- 一旦另一个线程完成,就会生成一个新线程
- CWnd::create 会生成一个新线程吗?
- 获取一个主程序,在一个新线程中启动一个从程序
- 如何使用boost::bind将io_service对象传递给一个新线程
- Qt每隔一秒创建一个新线程
- 在新线程中创建一个对话框
- 是否有可能在线程下创建一个新线程
- boost async_wait()将导致一个新线程
- 只在前一个线程完成时创建一个新线程
- 如何从JNI启动一个新线程
- 当添加一个用于监听网络的新线程时,应用程序冻结
- 应该在 ServiceMain 上创建一个新线程
- 为什么 boost::future:<T>:then() 会生成一个新线程?