QT多线程注意事项(利用movetothread)

for(int i=0;imoveToThread(thread[i]);
        thread[i]->start();
        connect(thread[i],SIGNAL(finished()),thread[i],SLOT(deleteLater()));
        connect(thread[i],SIGNAL(finished()),obj[i],SLOT(deleteLater()));        
    }

以上简单代码!

  1. 多线程,感觉QObject子类obj要封装好,变量独立,尽量不用全局变量,避免线程间访问互斥;
  2. 一个线程里new的变量,不能在其他线程使用;即不能跨线程调用;(这条是经常犯的错误!~切记)比如,有个全局变量*P,在子线程里P=new ***,在其他线程就不能使用P[i];
  3. obj构造函数,是在主线程里运行的,所以不能在构造函数里new一些线程里用的变量(就是上一条的例子(跨线程调用),不容易发现的一个错误!切记!!);但可以初始化变量;比如obj成员变量QNetworkAccessManager *manager_py;可以在构造函数里初始化manager_py=NULL;但不能在构造函数里new,只能在第一次线程函数调用时new;
    if(manager_bz==NULL)
    {
        manager_py = new QNetworkAccessManager();
    }
  4. 访问统一资源时,加锁,比如打开同一个文件,或者写入同一个变量;
  5. 我多个线程访问同一个文件,用全局锁才行;用私有变量就不行;
  6. QMutex mutex; //那就用全局变量吧
  7. obj[i]->moveToThread(thread[i]);之后,在主线程里obj[i].func();这样调用仍然是在主线程里运行的(并且这样运行有潜在风险:可能使用了在子线程里new的变量等等,又犯了跨线程调用的问题);必须使用信号槽使其在子线程调用。
  8. 线程正确退出、销毁;
  9. Widget::~Widget()
    {
        for(int i=0;iquit();
            thread[i]->wait();
            thread[i]->deleteLater();
        }
        delete ui;
    }
  10. 欢迎添加!~

 

你可能感兴趣的:(QT相关)