阅读:1653回复:10
应用程序与驱动程序通信的问题
应用程序中要从driver中读数据,但是driver中这个数据不能马上得到,必须等待一定的时间(可能很长)才能到此数据。我用的driverstudio写的驱动。应用程序中使用DeviceIoControl发送命令给driver,并设置了一个event,然后应用程序等待此event。在driver的DeviceControl函数中,收到此命令,然后就要等待数据产生,再设置event为有效来通知应用程序。问题是我是不是不能一直在driver的DeviceControl函数中等待数据产生?也就是说我必须把当前的IRP设置为PENDING?如果设置为PENDING,那么数据产生时我如何再来来处理这个IRP?具体如何处理,请各位指点。
|
|
沙发#
发布于:2003-01-20 16:35
可以完成这个IRp,app再开个线程等event。
|
|
板凳#
发布于:2003-01-20 17:22
这样的话除非数据到达会引发中断,否则driver怎么知道什么时候设置event
如果没有中断的话就用内核态线程等待,等到了再通知app |
|
|
地板#
发布于:2003-01-20 19:17
那么这个IRP是不是应该是一直是PENDING,直到数据到达为止?这样我才能在IRP中设置到达的数据指针和数量给应用程序。
|
|
地下室#
发布于:2003-01-20 20:34
好像如果driver一直pending的话,app端就会像死机一样一直等待,重绘之类的都无法相应,个人认为还是应该完成irp,另开一个内核线程等待完成后通知app。
如果在此期间driver不需要响应其他动作的话,在app端开一个用户态线程,用此线程调用driver并等待完成也可以 |
|
|
5楼#
发布于:2003-01-21 09:13
我的做法是:在app开一个线程,用DeviceIoControl发送命令给driver,然后等待事件;driver中先PENDING这个IRP,然后在另开的内核线程中等待数据,当数据来到时设置事件通知app,完成这个IRP,返回数据给app。
现象是一运行app就好像死了一样(当然这期间driver没有接收到数据)。 如果我先完成IRP,并在driver中另开一个内核线程,那么当收到数据时可以设置事件通知app,但是怎么把数据传给app呢?原来的那个IRP已经完成了,也就是说app中的DeviceIoControl已经返回了,它又怎么接收driver发来的数据呢? 新手,请多多指教。 |
|
6楼#
发布于:2003-01-21 09:44
数据可以用driver和app之间建立共享内存来实现,网站的专栏文章里有介绍
|
|
|
7楼#
发布于:2003-01-22 11:08
我的做法是:在app开一个线程,用DeviceIoControl发送命令给driver,然后等待事件;driver中先PENDING这个IRP,然后在另开的内核线程中等待数据,当数据来到时设置事件通知app,完成这个IRP,返回数据给app。 |
|
|
8楼#
发布于:2003-01-28 16:30
在用户线程中,再次调用 WaitEvent() DeviceControl(). 即可 |
|
9楼#
发布于:2003-01-30 02:49
重复了 |
|
|
10楼#
发布于:2003-02-04 14:40
在APP主线程中建立采集线程,主线程记时及检测是否有新数据,有就刷新屏幕;采集线程就是你现在的APP的功能,只是不刷新屏幕,有数据就通知主线程。别忘了在采集线程中加上判别主线程结束的程序以便退出。
|
|