您的位置:程序门 -> vc/mfc -> 进程/线程/dll



请各位大虾帮忙看下状态为什么不变(timer与sleep函数)


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


请各位大虾帮忙看下状态为什么不变(timer与sleep函数)[已结贴,结贴人:dinghui96]
发表于:2007-08-07 16:45:28 楼主
下面是程序代码段,原意为:当调用senddata函数时,当g_sendflg   ==   on,等待timer执行,然后g_sendflg   ==off,g_blsend=true。但现在sleep后,不执行timer.

senddata(short   size,   char   *data)
{
if(g_wdstate   ==   aidle   ¦ ¦   size   >   buffermax){
return   idc_failed;
}
if(g_wdstate   ==   cmdwaite){//指示待ち状態だけ送信
//送信内容記憶
memset(g_buff,   0,   sizeof(g_buff));
memcpy(g_buff,   data,   size);
g_wdcnt   =   size;
g_sendflg   =   on;
// while(g_sendflg   ==   on){//結果を待つ
sleep(100);
// }
if(g_blsend){//送信完了
return   idc_succeeded;
}else{
return   idc_failed;
}
}
//他の状態
return   idc_receving;
}

void   callback   timerproc(uint   nidevent)
{
unsigned   long   length   =   0;
bool   blrlt   =   false;
msg     msg;
try{
::getmessage(&msg,   null,   0,   0);
::dispatchmessage(&msg);
//受信
g_sts   =   0;
blrlt   =   readfile(g_hcom,&g_sts,sizeof(g_sts),&length,null);
//カウントインクリメント
g_intcnter   ++;
//送信フラグon
if(g_sendflg   ==   on){
g_sts   =   0;
g_szcmd   =   g_buff[stx];
//送信
g_blsend   =   writefile(g_hcom,g_buff,g_wdcnt,&length,null);
if(g_blsend){//送信成功
g_wdstate   =   recving;
g_intcnter   =   0;
}
g_sendflg   =   off;
发表于:2007-08-07 16:48:201楼 得分:40
没看代码,但是在主线程中sleep一辈子也是等不到wm_timer的,当然,也等不到任何其它消息。
发表于:2007-08-07 16:50:402楼 得分:0
不是吧,那我要是希望在一个函数的执行过程中,调用timer可能实现么?
发表于:2007-08-07 16:56:043楼 得分:30
同意一楼的

你的程序逻辑有点问题,应该把发送部分独立在一个函数里,senddata和tierproc都来调用才对
发表于:2007-08-07 17:09:494楼 得分:0
我想在函数运行期间开始timer运行,直到timer结束,继续执行程序,如何实现?
发表于:2007-08-07 17:12:525楼 得分:0
那你就直接调用timerproc,   把它当一般函数来调
发表于:2007-08-07 17:15:196楼 得分:0
还有别的方法么,那样timer事件不就乱了?
发表于:2007-08-07 18:11:387楼 得分:30
你到底是想用timer,每到一定的时间间隔才发送,   即使手动调senddata?   是不是这样?
如果是这样,你完全可以用一个队列来保存你要发送的信息,调用senddata的时候只是把这些信息加到队列里去,在响应timer的时候从队列里把这些命令读出来发送

在一个线程里是没有一个函数等待另外一个函数的说法的.   要不你就用multimedia   timer,   并使用线程同步的方式来达到你的要求.   问题就负责化了

你的程序执行逻辑很有问题


快速检索

最新资讯
热门点击