QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1459|回复: 5

各位大侠救救小弟啊,头大了~!

[复制链接]
发表于 2005-9-13 11:27:48 | 显示全部楼层 |阅读模式
[code:1]
void runtask()
{int i;
long int timeuse;
struct timeval tpstart,tpend;

while(1)
{for(i=0;i<TASKNUM;i++)
  {if(tasklt[i].use!=0&&tasklt[i].time_val==0)
   {tasklt[i].func(tasklt[i].arg);
    tasklt[i].use=0;
   }
   else if(tasklt[i].use!=0&&tasklt[i].time_val>0)
   {gettimeofday(&tpstart,NULL);
    //usleep(100000);
    gettimeofday(&tpend,NULL);
    timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+(tpend.tv_usec-tpstart.tv_usec);
    tasklt[i].time_val-=timeuse;
    printf("tasklt[%d].time_val=%ld\n",i,tasklt[i].time_val);
    if(tasklt[i].time_val<=0)
    {tasklt[i].func(tasklt[i].arg);
     tasklt[i].use=0;
    }
   }
  }
  //usleep(10000);
}
}
[/code:1]
我写了这么个函数,实现当tasklt.time_val时间值减少到0时执行tasklt.func指向的函数.tasklt.use是使用标志位,1代表同数组中参数可使用. 编译通过,但是程序中两个usleep,无论我打开谁,执行到那里就直接跳出循环.关上就能执行,但是执行完有效参数后仍然要退出while循环,怎么可能呢???while(1)不是应该无限循环吗?? 搞的头大了,各位大虾帮忙看看~!(我在另外一个程序中有使用和这个几乎一样的定时执行的方式,在那个程序中却没有问题)
 楼主| 发表于 2005-9-13 11:42:05 | 显示全部楼层
补充一下:我是开了两个线程,一个就是刚才那个函数,希望它隔10ms检查一次结构体数组中是否有可用参数,有就执行一次;另外一个线程专门给结构体数组中写入参数.这个结构体数组定义为全局变量
回复

使用道具 举报

发表于 2005-9-13 15:23:27 | 显示全部楼层
先把代码排版一下
回复

使用道具 举报

 楼主| 发表于 2005-9-13 16:59:26 | 显示全部楼层
真是麻烦板主了.原因我已经找到了,主要初学,对LINUX线程方面的DD吃的不透.
我是在main里面创建线程去执行runtask这个函数,main里面去set结构体数组中的数据,但是设置一次完成,main结束了,创建的这个线程也结束了.我加了个无限循环就好了.这只是我的理解,不知道板主和各位大虾有什么高见?
回复

使用道具 举报

发表于 2005-9-14 12:37:34 | 显示全部楼层
主函数里用pthread_join()可以等待线程结束
回复

使用道具 举报

 楼主| 发表于 2005-9-14 15:45:31 | 显示全部楼层
嗯,多谢板主.LINUX下的进程,线程方面的DD还要花很多时间去好好整整
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-5 11:42 , Processed in 0.045819 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表