QT5编程 多线程控制场景
在智能家居控制中一种场景控制,就是各种命令的组合控制,开关单一控制也是一种场景控制,可以统计进行管理。
场景控制一般需要使用多线程,因为一个场景还没有结束,另一个场景可能已经启动了,这样相互交叉。
我是这样实现的,首先建立一个场景执行类:再创建一个类的指针组数量可以自己定义,我定义了11组。再有就是调用名字问题我定义一个标志数值,启用的指针数值true,未使用的指针为false,这样循环使用。
场景执行代码:
class myOder : public QThread
{ Q_OBJECT
public:
QString Parameter;
int id;
~myOder(){}
void run(void){
QStringList lst;
lst =Parameter.split(";");
if(lst.length()>0){
for(int i=0;i<lst.length();i++){
QString oderTemp=lst.at(i) ;
QStringList oder1=oderTemp.split(",");
qDebug()<<id <<":list "<< i<<">>"<<oder1[1];
if (oder1[0]=="485"){ //485 发送
emit Send_sig(oderTemp);
}else if (oder1[0]=="sleep"){ //sleep ms
QString time=oder1[1];
QThread::msleep(time.toInt());
}else if (oder1[0]==""){
}
}
}
emit Send_sig(QString( "finish,%1").arg(id) );
this->quit();
}
signals:
void Send_sig(QString data );
};
在main.h 定义变量
myOder *Rmdy[10]; //线程指针组0-10
bool RMdyID[10]; //线程是否使用中的标志
在main.app中初始化标志 都为false
for(int i=0;i<11;i++){RMdyID[i]=false;}
在main.app 中的调用命令
int id=100;
for(int i=0;i<=10;i++){if(!RMdyID[i]){ id=i; RMdyID[i]=true;break; } }
if(id<100){ //防止11个线程溢出
Rmdy[id]=new myOder;
Rmdy[id]->Parameter=data;Rmdy[id]->id=id; //告诉线程,自己的id号码
connect(Rmdy[id], SIGNAL( Send_sig(QString)),this,SLOT(send_d(QString)));
Rmdy[id]->start(); }
//线程处理子程序。
void Widget::send_d(QString data) //发送数据
{ QStringList oder1=data.split(",");
if(oder1[0]“485”){
uart_t->send_data(oder1[1]); //执行485串口发送任务子程序。
} else if(oder1[0]“finish”){ QString S=oder1[1];
RMdyID[S.toInt()]=false; //线程结束,恢复标志位。
qDebug()<< “进程”<< oder1[1]<<“结束”;
}
}
例如:这是一组场景代码
485,1005000700007F4A;sleep,500;485,1005000100009F4B
步骤按分号分割,动作和参数按照逗号分割
第一步执行485信号发送1005000700007F4A,
第二步执行延时500毫秒
第三步执行485信号发送1005000100009F4B
以此类推完成各种场景操作。有些场景可能要延时时间较长,比如打开水龙头浇花。延时--------,关闭
这是再有新的指令过来不会相互影响。