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)

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

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

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt Creator ,可以使用 Qt 的信号和槽机制来实现一个 CPP 文件控制一个 CPP 文件的线程恢复和暂停。 假设你有两个 CPP 文件:main.cpp 和 thread.cpp。在 thread.cpp ,你需要定义一个线程并在其执行一些操作。在 main.cpp ,你需要控制线程暂停和恢复。 首先,在 thread.cpp ,你需要定义一个信号 `pauseThread()` 和一个槽函数 `onPauseThread()` 来实现线程暂停。代码如下: ```cpp class MyThread : public QThread { Q_OBJECT signals: void pauseThread(); public slots: void onPauseThread() { // 暂停线程的代码 this->wait(); } protected: void run() override { // 线程执行代码 while (true) { // ... QThread::msleep(100); // ... } } }; ``` 在 `run()` 函数,你可以执行一些需要在后台线程运行的代码。在 `onPauseThread()` 槽函数,你可以实现暂停线程的代码,例如使用 `wait()` 函数。 然后,在 main.cpp ,你需要实例化 `MyThread` 类并连接信号和槽函数。代码如下: ```cpp int main(int argc, char *argv[]) { QApplication a(argc, argv); MyThread thread; thread.start(); QObject::connect(&thread, &MyThread::pauseThread, &thread, &MyThread::onPauseThread); // ... return a.exec(); } ``` 在 `main()` 函数,你需要实例化 `MyThread` 类并启动线程。然后,你需要使用 `connect()` 函数将信号 `pauseThread()` 和槽函数 `onPauseThread()` 连接起来。 当你需要暂停线程时,只需要在 main.cpp 发出 `pauseThread()` 信号即可: ```cpp // 暂停线程 emit thread.pauseThread(); ``` 当你需要恢复线程时,只需要在 thread.cpp 使用 `start()` 函数重新启动线程即可: ```cpp // 恢复线程 this->start(); ``` 这样,你就可以在一个 CPP 文件控制一个 CPP 文件的线程恢复和暂停了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值