关于C++实现状态机的问题
现在有一个状态机要用c++实现(VC6.0),但是现在有一个问题,其中有一个瞬态A,在一定延时后,将自动转到下一个稳态B,也有可能在延时过程中触发了另一个条件,进入另一个稳态C,请问如何能实现瞬态,因为不能用单纯的Sleep(t),这样会造成程序卡在那个地方,不能接受到后面的触发条件。
[解决办法]
这种问题通常用timer来做最好不过了,但是如果只是简单的实现的话可以用下面的办法。
int delay = 0;
while(delay>N)
{
if(..)break;//判断师傅要到另外一个状态
delay ++;
sleep(1);
}
通过N可以调节延迟时间,更改sleep的参数可以控制精度,不过这个只是简单的办法,用计时器最好不过。
当然也可以用pthread开个线程出来计时
[解决办法]
#pragma comment(lib,"user32")
#include <stdio.h>
#include <time.h>
#include <sys/timeb.h>
#include <windows.h>
char datestr[16];
char timestr[16];
char mss[4];
void log(char *s) {
struct tm *now;
struct timeb tb;
ftime(&tb);
now=localtime(&tb.time);
sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
sprintf(timestr,"%02d:%02d:%02d",now->tm_hour ,now->tm_min ,now->tm_sec );
sprintf(mss,"%03d",tb.millitm);
printf("%s %s.%s %s",datestr,timestr,mss,s);
}
VOID CALLBACK myTimerProc1(
HWND hwnd, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
) {
log("In myTimerProc1\n");
}
VOID CALLBACK myTimerProc2(
HWND hwnd, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
) {
log("In myTimerProc2\n");
}
int main() {
int i;
MSG msg;
SetTimer(NULL,0,1000,myTimerProc1);
SetTimer(NULL,0,2000,myTimerProc2);
for (i=0;i<20;i++) {
Sleep(500);
log("In main\n");
if (GetMessage(&msg,NULL,0,0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return 0;
}
//2012-07-26 17:29:06.375 In main
//2012-07-26 17:29:06.875 In myTimerProc1
//2012-07-26 17:29:07.375 In main
//2012-07-26 17:29:07.875 In myTimerProc2
//2012-07-26 17:29:08.375 In main
//2012-07-26 17:29:08.375 In myTimerProc1
//2012-07-26 17:29:08.875 In main
//2012-07-26 17:29:08.875 In myTimerProc1
//2012-07-26 17:29:09.375 In main
//2012-07-26 17:29:09.890 In myTimerProc2
//2012-07-26 17:29:10.390 In main
//2012-07-26 17:29:10.390 In myTimerProc1
//2012-07-26 17:29:10.890 In main
//2012-07-26 17:29:10.890 In myTimerProc1
//2012-07-26 17:29:11.390 In main
//2012-07-26 17:29:11.890 In myTimerProc2
//2012-07-26 17:29:12.390 In main
//2012-07-26 17:29:12.390 In myTimerProc1
//2012-07-26 17:29:12.890 In main
//2012-07-26 17:29:12.890 In myTimerProc1
//2012-07-26 17:29:13.390 In main
//2012-07-26 17:29:13.890 In myTimerProc2
//2012-07-26 17:29:14.390 In main
//2012-07-26 17:29:14.390 In myTimerProc1
//2012-07-26 17:29:14.890 In main
//2012-07-26 17:29:14.890 In myTimerProc1
//2012-07-26 17:29:15.390 In main
//2012-07-26 17:29:15.890 In myTimerProc2
//2012-07-26 17:29:16.390 In main
//2012-07-26 17:29:16.390 In myTimerProc1
//2012-07-26 17:29:16.890 In main
//2012-07-26 17:29:16.890 In myTimerProc1
//2012-07-26 17:29:17.390 In main
//2012-07-26 17:29:17.890 In myTimerProc2
//2012-07-26 17:29:18.390 In main
//2012-07-26 17:29:18.390 In myTimerProc1
//2012-07-26 17:29:18.890 In main
//2012-07-26 17:29:18.890 In myTimerProc1
//2012-07-26 17:29:19.390 In main
//2012-07-26 17:29:19.890 In myTimerProc2
//怎样每隔两秒修改一个变量的值 并且放在程序后台进行。
#include <stdio.h>
#include <time.h>
#include <sys/timeb.h>
#include <process.h>
#include <windows.h>
int var1;
CRITICAL_SECTION CS;
struct tm *now;
struct timeb tb;
char datestr[16];
char timestr[16];
char mss[4];
void thdA(void *pcn) {
while (1) {
Sleep(2000);
EnterCriticalSection(&CS);
var1++;
LeaveCriticalSection(&CS);
}
}
int main() {
var1=1;
InitializeCriticalSection(&CS);
_beginthread((void(__cdecl *)(void *))thdA,0,(void *)1);
while (1) {
Sleep(500);
EnterCriticalSection(&CS);
ftime(&tb);
now=localtime(&tb.time);
sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
sprintf(timestr,"%02d:%02d:%02d",now->tm_hour ,now->tm_min ,now->tm_sec );
sprintf(mss,"%03d",tb.millitm);
printf("%s %s.%s var1==%d\n",datestr,timestr,mss,var1);
if (var1==9) {
LeaveCriticalSection(&CS);
break;
} else {
LeaveCriticalSection(&CS);
}
}
DeleteCriticalSection(&CS);
return 0;
}
//2013-06-19 16:51:02.468 var1==1
//2013-06-19 16:51:02.968 var1==1
//2013-06-19 16:51:03.468 var1==1
//2013-06-19 16:51:03.968 var1==1
//2013-06-19 16:51:04.468 var1==2
//2013-06-19 16:51:04.968 var1==2
//2013-06-19 16:51:05.468 var1==2
//2013-06-19 16:51:05.968 var1==2
//2013-06-19 16:51:06.468 var1==3
//2013-06-19 16:51:06.968 var1==3
//2013-06-19 16:51:07.468 var1==3
//2013-06-19 16:51:07.968 var1==4
//2013-06-19 16:51:08.468 var1==4
//2013-06-19 16:51:08.968 var1==4
//2013-06-19 16:51:09.468 var1==4
//2013-06-19 16:51:09.968 var1==4
//2013-06-19 16:51:10.468 var1==5
//2013-06-19 16:51:10.968 var1==5
//2013-06-19 16:51:11.468 var1==5
//2013-06-19 16:51:11.968 var1==5
//2013-06-19 16:51:12.468 var1==6
//2013-06-19 16:51:12.968 var1==6
//2013-06-19 16:51:13.468 var1==6
//2013-06-19 16:51:13.968 var1==6
//2013-06-19 16:51:14.468 var1==7
//2013-06-19 16:51:14.968 var1==7
//2013-06-19 16:51:15.468 var1==7
//2013-06-19 16:51:15.968 var1==7
//2013-06-19 16:51:16.468 var1==8
//2013-06-19 16:51:16.968 var1==8
//2013-06-19 16:51:17.468 var1==8
//2013-06-19 16:51:17.968 var1==8
//2013-06-19 16:51:18.468 var1==9
//
