如何在DLL中实现定时循环?
背景:
1.主程序:Windows程序,响应输入、实现输出;
2、仿真(运算)模块:DLL, 实现实时运算(每秒一次), 其相关变量可由主程序读/写,可以说该DLL仅仅完成运算。
问题:如何在DLL中实现定时循环已便于实现实时运算?
1、DLL中一定要用计时器(SetTimer...)才可以吗?
2、若要用计时器,一定要在DLL中创建Window吗?
3、请给出DLL的框架
谢谢、分不够再加
最好不用SETTIMER 这种带窗口句柄的方法 可考虑使用SETWAITABELTIME之类;使用可等待定时器线程
在dll中创建线程,线程中创建一个event,然后等待此event一秒,计算一次,如此循环。
void init()
{
创建线程;
}
线程函数()
{
创建event;
while(true)
{
等待event一秒;
计算;
}
}
其它的自己加。
I don't know MS but you can use following to sleep for 1 second or less:
timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
select(0, NULL, NULL, NULL, &tv); //sleep for 1 second.
好像明白了一点,可惜现在不能测试
to : yhlubber(lu): 我的DllMain()怎么写?是不是:
DllMain(..)
{
init();
}
to :do_do(do_do) :select(0, NULL, NULL, NULL, &tv); //sleep for 1 second. ????
to : wiler(贼狼) ( ) :
DLL 中消息循环咋实现? 和WinMain中一样吗?
各位大仙,能给个稍微详细的框架吗?
我到是实现了DLL中计时,用CreateWindow和SetTimer,执行消息循环,但是不太满意,因为我根本不需要窗口,而且LoadLibrary后,Freelibrary会在调用处出错,
估计是窗口或者消息循环作怪,
wqh136(wqh136) 说用SetWaitableTimer可以不用窗口,可惜没有例子,另外我也考虑用QueryPerformaceCounter,不知哪位有例子,给我好吗?
//创建可等定时器,15秒钟后立即启动,每隔20秒查询一次是否有自动任务要求完成
LARGE_INTEGER li ;
HANDLE g_WaitableTimer= CreateWaitableTimer(NULL,FALSE,NULL);
const int nNanosecondsPerSecond = 10000000 ;
_int64 qwTimeFromNowInNanoseconds = 15 * nNanosecondsPerSecond ;
qwTimeFromNowInNanoseconds = -qwTimeFromNowInNanoseconds ;
li.LowPart =(DWORD) (qwTimeFromNowInNanoseconds &0xFFFFFFFF);
li.HighPart = (LONG) (qwTimeFromNowInNanoseconds >>32 ) ;
SetWaitableTimer(g_WaitableTimer,&li ,1*1000 ,NULL ,NULL, FALSE );
//建立工作线程完成你的任务
DWORD m_threadid ;
HANDLE hThread = ::CreateThread(0, 0, MyThread, this , 0, &m_threadid);
if(hThread!=NULL) ::CloseHandle(hThread) ;
//线程 MyThread的结构应是
DWORD WINAPI MyThread(void *pThis)
{
CMyClass *pth = (CMyClass *) pThis ;
for(;;) {
WaitForSignalObject(pth->g_WaitableTimer ,INFINITE) ;
//do you word
}
}
几天没上了,谢谢各位,特别是wqh136,
CreateWaitableTimer我用不了(VC++6.0)
我在dll中准备不用窗口的,但是当我实现了不用窗口的dll后,发现程序死锁,程序未拷来,大致如下:
//----------sim.dll------------
int P_Exit = 1; //结束运算标志
DllMain()
{
return 1;
}
Sim()
{
P_Exit = 0;
while( !P_Exit)
{
t = 距上次计算时间差; //用QueryPerformaceCounter
if( t > 1.0f ) //1秒
计算;
}
}
ExitCalc()
{
P_Exit = 1;
}
//--------主程序---------
.....
if( Message==载入DLL )
LoadLibrary( "sim.dll");
......
if( Message == 开始运算 )
Sim(); //由于Sim()进入死循环, 主程序也死了
......
if( Message == 结束运算 )
ExitCalc();
...
各位先生,我该怎么办?我该用什么方法才能进入Sim()中呢?