QThread安全的結束線程

版權聲明:若無來源註明, Techie亮博客文章均爲原創。 轉載請以連接形式標明本文標題和地址:
本文標題:QThread安全的結束線程     本文地址: http://techieliang.com/2017/12/599/

1. QThread使用

基本使用請見:http://techieliang.com/2017/12/592/安全

在上文中提到了一個簡單範例:app

  1. #include <QCoreApplication>
  2. #include <QThread>
  3. #include <QDebug>
  4. class MyThread : public QThread {
  5. protected:
  6. void run() {
  7. while(1) {
  8. qDebug()<<"thread start:"<<QThread::currentThreadId();
  9. msleep(500);
  10. }
  11. }
  12. };
  13. int main(int argc, char *argv[]) {
  14. QCoreApplication a(argc, argv);
  15. qDebug()<<"Main:"<<QThread::currentThreadId();
  16. MyThread m;
  17. m.start();
  18. QThread::sleep(5);
  19. m.terminate();
  20. m.wait();
  21. return 0;
  22. }

此範例使用terminate強制關閉線程,此行爲是很危險的,下面提供一種安全的關閉方式spa

  1. #include <QCoreApplication>
  2. #include <QThread>
  3. #include <QDebug>
  4. class MyThread : public QThread {
  5. public:
  6. void stop() { //用於結束線程
  7. is_runnable =false;
  8. }
  9. protected:
  10. void run() {
  11. while(is_runnable) {
  12. qDebug()<<"thread start:"<<QThread::currentThreadId();
  13. msleep(500);
  14. }
  15. is_runnable = true;
  16. }
  17. private:
  18. bool is_runnable = true; //是否能夠運行
  19. };
  20. int main(int argc, char *argv[]) {
  21. QCoreApplication a(argc, argv);
  22. qDebug()<<"Main:"<<QThread::currentThreadId();
  23. MyThread m;
  24. m.start();
  25. QThread::sleep(5);
  26. m.stop();
  27. m.wait();
  28. return 0;
  29. }

經過對while循環增長bool類型做爲判斷實現安全的結束線程,當is_runnable=false時,程序會完成這次循環後結束,因此要wait等待,不可直接關閉程序。線程

相關文章
相關標籤/搜索