有点意思,以前做过类似的,改一改仅供参考:
思路很简单:不停的检测,发现当前工作的阀门还没有凑够2个,就找出下一个允许工作的阀门。
typedef struct
{
……其它参数
int work_s;//单次工作时间。
int cnt_work;//在界面设置这个工作循环次数,每工作一次就减1,减到0则不再执行
bool working;//true-正在工作
bool select;//true-选中
//临时变量:
int time_s;//当前已工作时间,就是一个秒计数器。从0累加,加到work_s后停止工作
}ValveStruct;//定义一个阀对象/结构体
#define _VALVE_NUM 13 //13个阀
ValveStruct valve[_VALVE_NUM];
int ValveThread(void)
{
static int cur=0;//当前阀序号(0至_VALVE_NUM-1)
#defint _MaxWorkintNum 2 //允许2个阀同时工作
static int working_num=0;//正在工作的阀个数(0-2)
while(1)
{
if(working_num<_MaxWorkintNum)//工作阀还没凑够限制数量,则获取下一个允许运行的阀并启动它
{
int next = GetNextValve(cur);//从当前指定的序号开始循环搜索列表,找到下一个允许运行的泵
if(next<_VALVE_NUM)//下一个阀有效
{
working_num++;//当前工作阀数量累加
cur = next;//更新当前阀序号
valve[cur].cnt_work--;//工作次数减1
valve[cur].working = true;//状态切换为“正在工作”
valve[cur].time_s = 0;//秒计数器清零
}
}
Sleep_s(1);//休眠1秒
for(int i=0;i<_VALVE_NUM;i++)
{
if(valve[i].working)//正在工作
{
valve[i].working = true;//状态切换为“正在工作”
valve[i].time_s++;//秒计数器累加
if(valve[i].time_s >= valve[i].work_s)//超过用户指定的单次工作时间,则停止工作
{
valve[i].working = false;
}
}
}
}
}
|