我有执行一个线程,如下
DWORD WINAPI Thread_Main(LPVOID lpParameter)
{
   while(条件)
   {
    // .....................    DeviceIoControl(参数...);
    //......................
    }
   return 0;
}这个线程循环一次大概需要400毫秒;
后来发现,主要因为DeviceIoControl是阻塞的,花费了将近300毫秒,
于是作如下修改;DWORD WINAPI Thread_Main(LPVOID lpParameter)
{
   while(条件)
   {
    // .....................    // 创建一个线程;
     CloseHandle(
         CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)Thread_IOCtrl, 
            LPVOID((参数), 0, NULL )
      );
    //......................
    }
   return 0;
}DWORD WINAPI Thread_IOCtrl(LPVOID) //
{
     DeviceIoControl(参数...);
}这样以来,我以为主线程的速度会大大提高,结果速度还是和以前一样慢,而如果我在Thread_IOCtrl线程中不执行DeviceIoControl,主线程的执行速度就大大提高;我非常不解,难道DeviceIoControl把主线也阻塞了?//==============================================================================
另外我也尝试了在CreateFile 时增加了 FILE_FLAG_OVERLAPPED 标志;
之后在ReadFile时确实是非阻塞的了, 但是在调用DeviceIoControl时还是一样慢;...
还请了解原委的大侠不吝赐教.

解决方案 »

  1.   

    主线程中是否有跟Thread_Main线程交互的地方,如果Thread_Main线程阻塞,是否会引起主线程等待或其他动作,从而影响主线程速度
      

  2.   

    DeviceIoControl是瓶颈,你放哪里都没用的................
      

  3.   

    没有交互,Thread_IOCtrl只需要调用DeviceIoControl即可,主线程创建该线程之后就与之无关了,
      

  4.   

    那你把子线程的Priority修改低一点,让主线程优先级更高..
      

  5.   

    DeviceIoControl与底层驱动处理代码有关
    每个控制码都不相同的
    应用层没有办法控制其返回时间,那怕把线程调到实时也没有用
      

  6.   

    你的主线程是不是也在访问DeviceIoControl所控制的设备(或文件)?对于同步设备,如果同一时间范围内有多个线程访问,则只有第1个线程可以顺利访问,其它线程会被阻塞。
      

  7.   

    DeviceIoControl
    第一次见到放到循环里的
    俺孤陋寡闻了
      

  8.   

    循环DeviceIoControl是很常见的,例如对设备进行监控。
      

  9.   


    同感
    一般是等待事件触发后,用DeviceIoControl取设备信息。DeviceIoControl的瓶颈,应用层很难绕过的。设备驱动的响应过程优先级怎么都比应用层高。
    建议去优化设备驱动程序。