发新话题
打印

[讨论]DLL中sleep的问题

[讨论]DLL中sleep的问题

议题提交:kindred
信息来源:邪恶八进制信息安全团队(www.eviloctal.com

环境是C++ Build 6.0,WinXP SP2
有一个DLL文件,其中的一个函数以一个进程的形式在svchost中运行
我想每3分钟运行一次这个函数
最先我在函数尾上加上sleep(180000),但是关机的时候不正常,会使关机变得很慢,因为此时函数在sleep,
然后我换成了
     time_t start_time;
     time_t current_time;

     time(&start_time);
     do
     {
      time(¤t_time);
     }while(difftime(current_time,start_time)<180.0);
这样的话,cpu占用率高达百分之90多,也行不通
在换成GetTickCount(win32 API函数)的方法,cpu还是太高。
请教各位还有什么好的方法?
谢谢了

TOP

有一个DLL文件,其中的一个函数以一个   进程    的形式在svchost中运行

写错了

是以一个   线程    的形式

TOP

time_t start_time;
   time_t current_time;

   time(&start_time);
   do
   {
    time(&t_time);
    Sleep(500);
   }while(difftime(current_time,start_time)<180.0);

这样会省很多cpu

TOP

但是这样也会和直接sleep一样

程序会没有响应

TOP

我的目的是每隔3分钟运行一次代码

如果大家有什么好的想法也可以提出来

TOP

试试sleepex,这个能接收消息.

或者用setevent+waitforsingleobject.试试,这个不占用cpu.
流氓会武术,谁都挡不住. http://hi.baidu.com/zvrop

TOP

setevent+waitforsingleobject
怎么用啊
详细点可以嘛?

有人说select也可以
但是我也不知道怎么用~~~

TOP

用事件也行  用定时器也行  Sleep毕竟不精确!
请加47809945   100%通过!每个月总有那么几天,您的网络会受到黑客的攻击--坐立不安,烦躁无力,使用虎虎开发的"月月舒"防火墙,超轻超薄,易于携带,提供由内到外的全方位保护,即使流量再大,也可以冲浪自如,再也不用担心侧漏啦。

TOP

由于我没有发表讨论的权限,又很想听听大家的想法借此发个贴,希望楼主不要介意!

TOP

可以去http://www.eviloctal.com/forum/thread.php?fid=58提交的

有人体到可以用如下方法
FD_ZERO(&fdRead);
FD_SET(socketmain,&fdRead);
select(0,&fdRead,NULL,NULL,NULL);
不耗资源

TOP

这是什么方法,socket的?你写的是socket程序?

我说的那些,<<windows核心编程>>里面有非常的详细的介绍.
流氓会武术,谁都挡不住. http://hi.baidu.com/zvrop

TOP

不是socket程序
上面的意思是建立一个socket
仅仅用来select
当然他不会成功了
所以会超时返回


算是定时的一个偏方吧

TOP

用Timer的办法:
TTimer *ww=new TTimer(NULL);
class wwww
{
public:
int why(int);
void __fastcall wwTimer(TObject *Sender)
{
  MessageBox(NULL,"11","22",MB_OK);
}
}www;

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{   ww->Interval=1000;
   ww->OnTimer = &www.wwTimer;
   ww->Enabled =true;

   return 1;
}

为什么MessageBox(NULL,"11","22",MB_OK); 不执行呢?????
但是如果我在DllMain中加入MessageBox(NULL,"11","22",MB_OK);就可以执行了

TOP

每3分钟运行一次函数用Sleep()来解决的确占用很大的内存

就象上面说滴,用Timer吗~~~


int Run()
   {
    UINT TimerID_1=NULL;
    TimerID_1=timeSetEvent(180000,
                                   1,
                               (LPTIMECALLBACK)MyTimeProc,
                                   0,
                               TIME_CALLBACK_FUNCTION|TIME_PERIODIC);
     …………
     timeKillEvent( TimerID_1 );
     return 0;
   }

void CALLBACK MyTimeProc(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
  {
    …………  
  }
http://hi.baidu.com/fengze

TOP

   WSADATA wsa;
   SOCKET WorkSock;
   timeval timer;
   fd_set fdRead;
   timer.tv_sec =20;
   timer.tv_usec =0;

   //中间用worksock做了一些事情;

   closesocket(WorkSock);
   WSACleanup();
   FD_ZERO(&fdRead);
   FD_SET(WorkSock,&fdRead);
   select(0,&fdRead,NULL,NULL,&timer);

这个怎么不行啊
这个select怎么没有等待啊
直接就返回了

TOP

发新话题