我有执行一个线程,如下
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时还是一样慢;...
还请了解原委的大侠不吝赐教.
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时还是一样慢;...
还请了解原委的大侠不吝赐教.
每个控制码都不相同的
应用层没有办法控制其返回时间,那怕把线程调到实时也没有用
第一次见到放到循环里的
俺孤陋寡闻了
同感
一般是等待事件触发后,用DeviceIoControl取设备信息。DeviceIoControl的瓶颈,应用层很难绕过的。设备驱动的响应过程优先级怎么都比应用层高。
建议去优化设备驱动程序。