阅读:2106回复:11
如何多线程访问驱动程序?
请问各位,我想在应用层多线程访问驱动程序,在驱动程序中对应多线程访问硬件不同的端口,但应用层到驱动层之间应该如何做?
我考虑应该解析DeviceIoControl命令,但不知道应该如何下手,特向各位大虾请教。 |
|
|
沙发#
发布于:2001-11-03 08:54
你自己考虑一个数据结构来控制各个线程对应的端口.
|
|
|
板凳#
发布于:2001-11-03 19:26
请问一下,什么地方可以找到相应的资料?
|
|
|
地板#
发布于:2001-11-04 14:43
通常写DRIVER DDK的文档是首要的求助对象。
而应用则借助SDK文档。VC的类库要看MSDN的VC部分的章节。 |
|
|
地下室#
发布于:2001-11-05 12:46
I See.
但是如何使用“一个数据结构来控制各个线程对应的端口”? 哪儿有相关的资料呢? |
|
|
5楼#
发布于:2001-11-06 09:32
我有一个较笨的方法:
你在应用程序中,使用Mutex来区别线程, pName="mutex0"; nDevIoCtl=0x800; do { nDevIoCtl++; (*(pName+5))++; RW_Device=CreateMutex(NULL,true,pName); nWaitResult=GetLastError(); }while(nWaitResult == ERROR_ALREADY_EXISTS) 然后,你在驱动中对应不同的nDevIoCtl采用不同的端口即可。 我记得Mutex可区别线程,而event不行。以上方法是我的设想,你可试一下。 |
|
6楼#
发布于:2001-11-07 12:22
[QUOTE]原本由 blue 发表
[B]我有一个较笨的方法: 你在应用程序中,使用Mutex来区别线程, pName="mutex0"; nDevIoCtl=0x800; do { nDevIoCtl++; (*(pName+5))++; RW_Device=CreateMutex(NULL,true,pName); nWaitResult=GetLastError(); }while(nWaitResult == ERROR_ALREADY_EXISTS) 然后,你在驱动中对应不同的nDevIoCtl采用不同的端口即可。 我记得Mutex可区别线程,而event不行。以上方法是我的设想,你可试一下。 [/B][/QUOTE] 非常感谢你的回复。 你的这种方法是在应用层做多线程处理。 在通常的情况下,DeviceIoControl函数采用独占的方式,在前一个IRP没有返回之前不能处理第二个IRP,而且DeviceIoControl函数处理速度较慢。 现在我想在应用层多通道访问驱动程序。也就是说同时有N个IRP发送给驱动程序,驱动程序中分别对应N个线程处理。这样可以提升速度。 |
|
|
7楼#
发布于:2001-11-08 09:58
Mutex is hard loading and bad performance??
thx. |
|
|
8楼#
发布于:2001-12-13 03:59
\"If hDevice was opened with the FILE_FLAG_OVERLAPPED flag, lpOverlapped must point to a valid OVERLAPPED structure. In this case, the operation is performed as an overlapped (asynchronous) operation. \"
--MSDN Hope it helpful. |
|
9楼#
发布于:2001-12-25 23:34
可以不用系统提供的irp排队的方法,而是自己实现irp多个队列的排队,一个队列对应一个端口
在user mode DeviceIoControl可以在传入的数据结构中加入端口的信息,在IRP_MJ_DEVICE_CONTROL的处理函数中把irp根据传入的标志把irp排入不同的队列 |
|
10楼#
发布于:2002-01-02 01:26
问题读起来问题比较暧昧。
首先除非是互斥设备,driver应该是工作在多线程下的。 关于[驱动程序中分别对应N个线程处理可以提高速度]。driver执行时使用caller的线程空间。 如果线程和port的对应关系已经确定,根本就没有你的问题。 如果因为某种原因,一定要实现的话,lu0说的方法对。说到具体的实现,你可以把请求在kernel下实现排队,预先启动几个system thread作为工作线程, 他们wait 各自的排队 symaphore.. 这样可以实现一些特殊目的。 关于deviceiocontrol慢的问题,要看你是用什么IO机制,对于大数据量传输,只要你不使用bufferedio,问题没有想象得那么大。 |
|
11楼#
发布于:2002-01-02 23:53
谢谢老兄的回复。
我想可能我表达的不太清楚, 我的意思是应用层如何同时多线程访问一个硬件实体。从应用层发起一个访问后,硬件还没有返回,这个时候第二个请求也能同时送入驱动程序,通过驱动送相应的硬件端口处理。 |
|
|