创建一个输入/输出(I / O)完成端口,并将它与一个指定的文件句柄,或创建一个I / O完成端口尚未与文件句柄相关联。
HANDLE WINAPI CreateIoCompletionPort( _In_ HANDLE FileHandle, _In_opt_ HANDLE ExistingCompletionPort, _In_ ULONG_PTR CompletionKey, _In_ DWORD NumberOfConcurrentThreads );
-
FileHandle的 []
-
一个打开的文件句柄或INVALID_HANDLE_VALUE。
手柄必须是一个对象,该对象支持重叠的I / O。
如果一个手柄,它具有重叠I / O完成已打开。例如,你必须指定FILE_FLAG_OVERLAPPED标志,使用时 的CreateFile函数来获得这个句柄。
INVALID_HANDLE_VALUE,函数创建一个I / O完成端口,而不与文件句柄相关联。在这种情况下,的ExistingCompletionPort参数必须是NULL,CompletionKey参数将被忽略。
ExistingCompletionPort [可选]
-
现有I / O完成端口或NULL的句柄。
如果此参数指定一个现有I / O完成端口的功能文件句柄参数指定的句柄相关联。该函数返回句柄现有的I / O完成端口,如果成功的话,它不会创建一个新的I / O完成端口。
如果此参数为NULL,则函数创建一个新的I / O完成端口,如果文件句柄参数是有效的,联营公司新的I / O完成端口。否则没有的文件句柄协会发生。该函数返回的句柄到新的I / O端口,如果成功完成。
CompletionKey []
-
用户定义手柄完成键中包含的每个I / O完成包指定的文件句柄。欲了解更多信息,请参阅“备注”部分。
NumberOfConcurrentThreads []
-
该操作系统可以允许同时处理I / O完成的I / O完成端口的数据包的最大的线程数。如果不是NULL的ExistingCompletionPort参数,此参数被忽略。
如果该参数为0,则该系统允许尽可能多的并行运行的线程,因为系统中的处理器。
返回值
如果函数调用成功,则返回值是一个I / O完成端口的句柄:
如果的ExistingCompletionPort参数为NULL,则返回值是一个新的手柄。
如果的ExistingCompletionPort参数是一个有效的I / O完成端口句柄,返回值是相同的句柄。
如果文件句柄参数是一个有效的句柄,现在与该文件句柄返回I / O完成端口。
如果函数失败,返回值是NULL。为了得到扩展的错误信息,调用的GetLastError函数功能。
备注
I / O系统,可以指示发送I / O完成通知包到I / O完成端口,他们在那里排队。 CreateIoCompletionPort函数提供此功能。
一个I / O完成端口和它的手柄是与创建它的进程和进程之间不共享。然而,单一的手柄是在同一进程中的线程之间共享。
CreateIoCompletionPort可用于三种不同的模式:
- 只创建一个不与文件句柄相关联的I / O完成端口。
- 现有I / O完成端口与文件句柄相关联。
- 执行创建和协会在一个单一的通话。
要创建一个不相关联的I / O完成端口,设置参数句柄INVALID_HANDLE_VALUE,NULL参数ExistingCompletionPort,CompletionKey参数为零(在这种情况下被忽略)。设置参数NumberOfConcurrentThreads新的I / O完成端口,或零为默认(系统中处理器的数量)到所需的并发值。
句柄传递文件句柄参数可以是任何手柄,支持重叠I / O 最常见的是,这是一个使用FILE_FLAG_OVERLAPPED标志(例如,文件,邮件插槽,管道)的CreateFile函数打开手柄。其他功能,如插座所创建的对象,也可以与同一个I / O完成端口。对于一个示例使用插座,看到的AcceptEx。句柄可以只有一个I / O完成端口相关联,协会后,手柄仍然与I / O完成端口,直到它被关闭相关。
对于I / O完成端口的理论,用法,和相关功能的更多信息,请参阅“ I / O完成端口。
一个单一的I / O完成端口通过调用CreateIoCompletionPort多次,与相 同的I / O完成端口手柄在ExistingCompletionPort的参数和不同的文件句柄文件句柄参数每次可以关联多个文件句柄。
使用CompletionKey参数来帮助您的应用程序的I / O操作的轨道已完成。CreateIoCompletionPort功能控制不使用此值,而是附加到指定的文件句柄文件句柄参数在当时协会的I / O完成端口。这个完成的关键应该是唯一的每个文件句柄,它伴随着整个内部完成排队过程中的文件句柄。当一个完成包到达GetQueuedCompletionStatus的函数调用中返回。CompletionKey参数也使用PostQueuedCompletionStatus自己的特殊目的完成包队列功能。
实例后一个打开的句柄相关联的I / O完成端口,它不能被用来在 ReadFileEx或 WriteFileEx功能,因为这些功能都有自己的异步I / O机制。
最好是不要共用一个I / O完成端口可以使用手柄继承或DuplicateHandle函数调用相关的文件句柄 。这样的重复执行的操作处理,生成完成通知。
建议仔细考虑被称为I / O完成端口句柄和每一个文件处理与特定I / O完成端口相关的I / O完成端口。I / O完成端口被释放时,有没有更多的参考资料。因此,所有这些手柄必须正确关闭,以释放I / O完成端口和其相关联的系统资源。满足这些条件后,关闭I / O完成端口句柄调用 CloseHandle的功能。