Bootstrap

Qt中控制一个线程暂停和启动,以及中途停止一个线程的方法

需要线程停止的目的:

有时开启一个线程是为了把耗时的操作转移到线程中执行,主进程中可以执行其它的任务,避免了因为大量的重复性操作导致主进程阻塞。

控制线程暂停的方法:

线程的同步用到了QMutex类,作为一个互斥锁控制进行保护。如果在主进程中把线程里面的互斥锁获取,那么线程中再次获取该锁就会失败,引起线程阻塞,主进程执行操作结束后,释放该锁,线程就会再次启动。以上思路实现了线程的暂停和开启。

具体实现代码:

1、线程中代码框架

void thread::run(){
    mutex.lock();    //获得锁
    /*********/
    /........../
    mutex.unlock();  //释放锁
}

2、主进程中代码

void mainwindows::doSomething(){
    thread.mutex.lock();
    /*****************/
    thread.mutex.unlock();
}

中途停止线程的方法

Qt线程的停止可通过三种方式实现:

1、利用quit(或者exit(0))

this.quit();

2、使用terminate

this.terminate();

this.wait();

3、利用volatile

        一种是使用标志位,这种方法最好,在while循环中使用标志位判断是否满足进行循环的条件,并在run函数结束时将stoped置为初始化的值false。(stop定义:volatile bool stopped)

第三中方法线程还在运行,只不过运行的内容是空的。

测试第二中方法可以实现中途停止线程。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;