创建线程的方法一般都是重写qthread,或者继承qobect,详见QT助手
class Worker : public QObject
{
Q_OBJECT
public slots:
void doWork() {
...
}
};
void MyObject::putWorkerInAThread()
{
Worker *worker = new Worker;
QThread *workerThread = new QThread(this);
connect(workerThread, SIGNAL(started()), worker, SLOT(doWork()));
connect(workerThread, SIGNAL(finished()), worker, SLOT(deleteLater()));
worker->moveToThread(workerThread);
// Starts an event loop, and emits workerThread->started()
workerThread->start();
}
QThread 概述
当使用 started(), finished(), and terminated(),会发送一个信号,可以使用isFinished() and isRunning()来查询线程的状态,
停止线程调用 exit() or quit(),在极端的情况下,在线程正在执行的时候调用 terminate() ,这样做是很危险的,详细查看terminate()和 setTerminationEnabled() ,
wait()用来阻塞当前线程,直到另一个线程执行结束或者指定的时间到达
currentThreadId() and currentThread()这两个静态函数用来获取线程ID和线程对象
QThread函数解读
QThread::QThread ( QObject * parent = 0 ) 创建一个对象
QThread::~QThread () 析构删除一个对象,要强制析构的话, isFinished()先要查询下线程是否结束,否则会引起线程崩溃
QThread * QThread::currentThread () [static] 返回一个线程指针,用来管理目前正在执行的线程
Qt::HANDLE QThread::currentThreadId () [static] 返回一个线程ID,这个函数返回的句柄用于内部目的并且不应该在任何应用程序代码中使用它
int QThread::exec () [protected] 线程循环函数,当调用exit()退出,如果是通过quit()调用exit()退出,则返回0
void QThread::exit ( int returnCode = 0 ) 告诉时间循环结束,带着一个返回码
void QThread::finished () [signal]当线程完成时,发送此信号
int QThread::idealThreadCount () [static]返回CPU核数
bool QThread::isFinished () const 如果线程完成返回true
bool QThread::isRunning () const 如果线程正在运行返回true
void QThread::msleep ( unsigned long msecs ) [static protected] 迫使当前线程 睡眠多少毫秒
Priority QThread::priority () const 返回线程的优先级
void QThread::quit () [slot] 退出等同于 QThread::exit(0).
void QThread::run () [virtual protected] 线程起始点,在调用start之后,新创建的线程调用这个函数,之后调用默认的exec()函数,
void QThread::setPriority ( Priority priority )//设置线程优先级
void QThread::setStackSize ( uint stackSize )//设置堆的大小
void QThread::setTerminationEnabled ( bool enabled = true ) [static protected]//当设置为false时,以后调用 QThread::terminate()没有任何影响,直接返回
void QThread::sleep ( unsigned long secs ) [static protected]//强制目前线程休眠
uint QThread::stackSize () const//返回分配堆的大小
void QThread::start ( Priority priority = InheritPriority ) [slot]//线程开始,之后调用run()
void QThread::started () [signal]、、开始信号
void QThread::terminate () [slot]//强制关闭线程
void QThread::terminated () [signal]//信号
bool QThread::wait ( unsigned long time = ULONG_MAX )//线程挂起多久
void QThread::yieldCurrentThread () [static]
让开线程给另一个可运行的线程。注意这由操作系统决定