new QThread 几时终结
new QThread 何时终结?
我在主界面窗口里new 了一个工作对象 new 了一个工作线程,将worker放到线程里做数据库查询。
现在问题是线程结束时如何终止是安全的?
我试过2种办法,好像大多数时候都运行正常的。
1, slot 函数里任务执行完了,发射信号到主窗口,然后主窗口有线程的指针,终结线程并删除指针。
2, slot函数里调用静态方法,就是我上面标示出来的,这是QT的方法,但我不确定还要不要删除thread指针了。(我试过了,无法删除,容易出错)。
所以1,2执行一次都会成功的,甚至3-5次都没问题。但我连续不停点击,一口气点十几下,它就异常退出了。不明原因。如果是用方法1,我想可能是后来的线程删除掉了前面的线程指针。但方法2我就不知道为什么还出来这种状(除非qtthread 在connect 下是不安全的)???
------解决思路----------------------
《Windows核心编程》
void FindDialog::doQuery()
{
w = new Worker;
qDebug()<<"=MainThread["<<QThread::currentThreadId();//<<"] ("<<concurrent<<")";
th = new QThread(this);
connect(th,SIGNAL(started()),w,SLOT(slot1()));
connect(th,SIGNAL(finished()),w,SLOT(deleteLater()));//this destroy work object.
connect(th,SIGNAL(finished()),this,SLOT(deleteWorker()));//destroy sub-thread
w->moveToThread(th);
th->start();
}
void FindDialog::deleteWorker()
{
//when to destroy th?
qDebug()<<"delete thread pointer in Main.";
}
void Worker::slot1()
{
qDebug()<<"-- thread["<<QThread::currentThreadId()<<"]";
tmpTime.start();
m_db.transaction();
for (int i = 0 ; i < 100000 ; i++ )
{
QString str3 = QString("insert into test(content) values('[Checked]')");
m_query->exec(str3);
}
m_db.commit();
qDebug()<<"Time Elapsed: "<<tmpTime.elapsed()<<" ms";
if (m_query->lastError().isValid())
qDebug()<<"#"<<m_query->lastError() ;
qDebug()<<"query done.";
QThread().thread()->quit();
QThread().thread()->wait();
emit sig1();//sent to main thread to teminate me.
}
我在主界面窗口里new 了一个工作对象 new 了一个工作线程,将worker放到线程里做数据库查询。
现在问题是线程结束时如何终止是安全的?
我试过2种办法,好像大多数时候都运行正常的。
1, slot 函数里任务执行完了,发射信号到主窗口,然后主窗口有线程的指针,终结线程并删除指针。
2, slot函数里调用静态方法,就是我上面标示出来的,这是QT的方法,但我不确定还要不要删除thread指针了。(我试过了,无法删除,容易出错)。
所以1,2执行一次都会成功的,甚至3-5次都没问题。但我连续不停点击,一口气点十几下,它就异常退出了。不明原因。如果是用方法1,我想可能是后来的线程删除掉了前面的线程指针。但方法2我就不知道为什么还出来这种状(除非qtthread 在connect 下是不安全的)???
------解决思路----------------------
《Windows核心编程》