请各位大虾帮忙看下状态为什么不变(Timer与Sleep函数)
下面是程序代码段,原意为:当调用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;
[解决办法]
没看代码,但是在主线程中sleep一辈子也是等不到wm_timer的,当然,也等不到任何其它消息。
[解决办法]
同意一楼的
你的程序逻辑有点问题,应该把发送部分独立在一个函数里,SendData和TierProc都来调用才对
[解决办法]
你到底是想用Timer,每到一定的时间间隔才发送, 即使手动调SendData? 是不是这样?
如果是这样,你完全可以用一个队列来保存你要发送的信息,调用SendData的时候只是把这些信息加到队列里去,在响应Timer的时候从队列里把这些命令读出来发送
在一个线程里是没有一个函数等待另外一个函数的说法的. 要不你就用MultiMedia Timer, 并使用线程同步的方式来达到你的要求. 问题就负责化了
你的程序执行逻辑很有问题