关于DeviceIoControl阻塞的疑问

xxdelta 2009-11-18 02:37:49
我有执行一个线程,如下
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时还是一样慢;

...




还请了解原委的大侠不吝赐教.






...全文
462 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dingnifei123 2009-11-20
  • 打赏
  • 举报
回复
来学习的,顺道接分~
wangk 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 cnzdgs 的回复:]
循环DeviceIoControl是很常见的,例如对设备进行监控。
[/Quote]

同感
一般是等待事件触发后,用DeviceIoControl取设备信息。

DeviceIoControl的瓶颈,应用层很难绕过的。设备驱动的响应过程优先级怎么都比应用层高。
建议去优化设备驱动程序。
cnzdgs 2009-11-20
  • 打赏
  • 举报
回复
循环DeviceIoControl是很常见的,例如对设备进行监控。
cnzdgs 2009-11-19
  • 打赏
  • 举报
回复
你的主线程是不是也在访问DeviceIoControl所控制的设备(或文件)?对于同步设备,如果同一时间范围内有多个线程访问,则只有第1个线程可以顺利访问,其它线程会被阻塞。
MoXiaoRab 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 programmerno1 的回复:]
DeviceIoControl
第一次见到放到循环里的
俺孤陋寡闻了
[/Quote]

同感

我被吓到了
ProgrammerNO1 2009-11-19
  • 打赏
  • 举报
回复
DeviceIoControl
第一次见到放到循环里的
俺孤陋寡闻了
djjs280 2009-11-18
  • 打赏
  • 举报
回复
DeviceIoControl与底层驱动处理代码有关
每个控制码都不相同的
应用层没有办法控制其返回时间,那怕把线程调到实时也没有用



oyljerry 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xxdelta 的回复:]
引用 2 楼 oyljerry 的回复:
主线程中是否有跟Thread_Main线程交互的地方,如果Thread_Main线程阻塞,是否会引起主线程等待或其他动作,从而影响主线程速度

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

[/Quote]
那你把子线程的Priority修改低一点,让主线程优先级更高..
xxdelta 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 oyljerry 的回复:]
主线程中是否有跟Thread_Main线程交互的地方,如果Thread_Main线程阻塞,是否会引起主线程等待或其他动作,从而影响主线程速度
[/Quote]
没有交互,Thread_IOCtrl只需要调用DeviceIoControl即可,主线程创建该线程之后就与之无关了,
xxdelta 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dirdirdir3 的回复:]
DeviceIoControl是瓶颈,你放哪里都没用的................
[/Quote]
那这个怎么解决?
hhwei1985 2009-11-18
  • 打赏
  • 举报
回复
up
dirdirdir3 2009-11-18
  • 打赏
  • 举报
回复
DeviceIoControl是瓶颈,你放哪里都没用的................
oyljerry 2009-11-18
  • 打赏
  • 举报
回复
主线程中是否有跟Thread_Main线程交互的地方,如果Thread_Main线程阻塞,是否会引起主线程等待或其他动作,从而影响主线程速度
凤朝凰 2009-11-18
  • 打赏
  • 举报
回复
看完发现不懂,顶下好了

2,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧