Linux下Qt多线程服务,Linux Qt下简单的多线程编程
QString print_str;//要输出的字符串
protected:
void run();
修改对应cpp代码:
#include "childthread.h"
#include //注意添加头文件
childthread::childthread(QObject *paren
private: QString print_str;//要输出的字符串 protected: void run(); 修改对应cpp代码: #include "childthread.h" #include //注意添加头文件 childthread::childthread(QObject *parent) : QThread(parent) { print_str = "default";//默认输出default } childthread::childthread(QString str) { print_str = str; } childthread::~childthread() { } void childthread::run(){ //转换string为char* QByteArray ba = print_str.toLatin1(); const char *debug_str = ba.data(); while(1){ qDebug(debug_str); sleep(1); } } 注意这里:一定要先实例化QByteArray ba,不能用const char *debug_str = print_str.toLatin1().data(); 也不要用toAnsii().data(); 这样就完成了子线程的代码了linux 线程,下面通过主线程创建子线程。 调用子线程 修改main.cpp代码: #include #include "childthread.h" int main(int argc, char *argv[]) { QString str = "child thread 2"; childthread *t1; childthread *t2; t1 = new childthread();//创建线程1 t2 = new childthread(str);//创建线程2 t1->start();//相当于执行线程1的run函数 t2->start();//相当于执行线程2的run函数 while(1) { qDebug("main thread"); sleep(1); } return 0; } 接下来编译输出可以在控制台看到3个线程都在同时工作: 另外终止线程使用: t1->terminate(); //终止线程1 t1->wait(); //阻塞等待 界面绘制问题 这里要注意,在子线程中不要调用界面绘制函数,如果要使用可以采用子线程发射信号,主线程connect信号与槽,槽代码在主线程中执行。 //子线程头文件中定义信号: signals: void change(); //子线程cpp:重载的run函数中发射信号 void childThread::run(){ while(1){ emit change(); QCoreApplication::processEvents();//处理事件 } } //主线程头文件定义槽 public slots: void view_update();//绘制界面函数 //主界面cpp连接信号与槽 connect(thread, SIGNAL(change()), this,SLOT(view_update())); //这里的view_update中可以使用界面绘制函数,保证线程安全。 PV操作问题 如果在线程中使用PV操作的话注意,如果PV操作放在子线程中,阻塞的是子线程,如果放在主线程中阻塞的是主线程,(即使调用的程序是在其他线程) (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |