子函数用状态机写法,如何解决多处调用重入问题?[已解决]
本帖最后由 foxpro2005 于 2013-2-27 16:16 编辑遇到个问题,子函数也采用状态机写法,如果这个子函数被多处调用,如何解决多处调用重入问题? 状态变量用参数传进入 本帖最后由 foxpro2005 于 2013-2-27 16:09 编辑
找到解决办法了,利用信号量互锁机制。(并使用行号来作进程任务号)#include <stdio.h>
#include <stdlib.h>
void Task(char *str1, char *str2, unsigned int ProcessID)
{
static unsigned int lc = 0; // 记录进程号(行号)
static unsigned char lock = 0; // 信号锁
static unsigned char i = 0;
if(!lock || lc == ProcessID){
lock = 1;
lc = ProcessID;
if(i == 0) {
printf("%s\n",str1);
i++;
}
else
{
printf("%s\n",str2);
i = 0;
lock = 0;
}
}
}
int main()
{
unsigned int i;
for(i=0; i<3; i++){
Task("This is 01 task - A","This is 01 task - B",__LINE__);
Task("This is 02 task - A","This is 02 task - B",__LINE__);
Task("This is 03 task - A","This is 03 task - B",__LINE__);
Task("This is 04 task - A","This is 04 task - B",__LINE__);
}
return 0;
}
是否还有更好的办法?
CB的工程文件:
状态函数所有变量(含状态)用一个结构体保存,每次调用该函数,传入结构体指针 xivisi 发表于 2013-2-27 17:40 static/image/common/back.gif
状态函数所有变量(含状态)用一个结构体保存,每次调用该函数,传入结构体指针 ...
xivisi 大侠:可以举个例子么? 谢谢 foxpro2005 发表于 2013-2-27 18:19 static/image/common/back.gif
xivisi 大侠:可以举个例子么? 谢谢
参考,傻孩子帖子 xivisi 发表于 2013-2-27 18:22 static/image/common/back.gif
参考,傻孩子帖子
刚才找了一下,可以给一个具体的链接么? 谢谢 (不要BS我哈....) foxpro2005 发表于 2013-2-27 18:46 static/image/common/back.gif
刚才找了一下,可以给一个具体的链接么? 谢谢 (不要BS我哈....)
typedef struct TimeOutState
{
int State;
unsigned int StartTime;
unsigned int TimeOut;
unsigned int EndTime;
} TimeOutState;
int TimeOut(TimeOutState* Args)
{
extern unsigned int SystemTime;
switch(Args->State)
{
case 0:
Args->StartTime=SystemTime;
Args->State++;
case 1:
if((SystemTime-Args->StartTime)<Args->TimeOut)
{
return Args->State;
}
Args->State++;
Args->EndTime=SystemTime;
}
}算了,这有个简单的超时代码,SystemTime是系统定时器中断自增的 返回值,根据需要,可返回状态 xivisi 发表于 2013-2-27 19:00 static/image/common/back.gif
返回值,根据需要,可返回状态
非常感谢 返回值用结构体指针 {:lol:}收获很大,谢谢
页:
[1]