Delphi 完成端口使用

来源:互联网 发布:人工智能的原理是什么? 编辑:程序博客网 时间:2024/05/21 08:52

Delphi 完成端口相关函数。

变量

    FCompletionPort : THandle; //完成端口的相关信息const     GOWORK = $FFFFEEEE;///开始工作    WORKBEAT = $FFFFEEDD;///线程心跳    GOSEND = $FFFFEECC;///发送数据    POOLPAUSE = $FFFFCCCC;///暂停    SHUTDOWN_FLAG = $FFFFFFFF;///线程关闭    HEARTBEAT_FLAG = $FFFFFFEE;///处理线程池的心跳维持

1、CreateIOCompletionPort 创建完成端口
FCompletionPort := CreateIOCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0);
参数:
__in HANDLE FileHandle,
__in_opt HANDLE ExistingCompletionPort,
__in ULONG_PTR CompletionKey,
__in DWORD NumberOfConcurrentThreads
返回值:
返回一个IOCP的句柄。若为NULL则创建失败,不为NULL则创建成功。
2、PostQueuedCompletionStatus 投递工作状态
nRet := PostQueuedCompletionStatus(FCompletionPort, 0, 0,Pointer(WORKBEAT));

BOOL PostQueuedCompletionStatus(
HANDLE CompletlonPort,
DW0RD dwNumberOfBytesTrlansferred,
DWORD dwCompletlonKey,
LPOVERLAPPED lpoverlapped,
);
CompletionPort:指定想向其发送一个完成数据包的完成端口对象。
dwNumberOfBytesTrlansferred:指定—个值,直接传递给GetQueuedCompletionStatus函数中对应的参数
dwCompletlonKey:指定—个值,直接传递给GetQueuedCompletionStatus函数中对应的参数
lpoverlapped:指定—个值,直接传递给GetQueuedCompletionStatus函数中对应的参数

3、 GetQueuedCompletionStatus 获取完成端口上的当前工作状态, 比如此时端口上完成的是什么操作,数据是什么等 ;有可能获取不成功根据返回值确定。

bRet := GetQueuedCompletionStatus(FCompletionPort, dwBytes,
DWORD(PHandleKey), POverlapped(PHandleData), INFINITE);

BOOL GetQueuedCompletionStatus(
HANDLE CompletionPort,
LPDWORD lpNumberOfBytes,
PULONG_PTR lpCompletionKey,
LPOVERLAPPED *lpOverlapped,
DWORD dwMilliseconds);
调用参数:
CompletionPort:指定的IOCP,该值由CreateIoCompletionPort函数创建。
lpnumberofbytes:一次完成后的I/O操作所传送数据的字节数。
lpcompletionkey:当文件I/O操作完成后,用于存放与之关联的CK。
lpoverlapped:为调用IOCP机制所引用的OVERLAPPED结构。
dwmilliseconds:用于指定调用者等待CP的时间。
返回值:
调用成功,则返回非零数值,相关数据存于lpNumberOfBytes、lpCompletionKey、lpoverlapped变量中。失败则返回零值。

4、CloseHandle 关闭完成端口
CloseHandle( FCompletionPort);

完成端口,使用其的主要目的是提高IO的吞吐量;

其实可以把完成端口看成系统维护的一个队列,操作系统把重叠IO操作完成的事件通知放到该队列里,由于是暴露 “操作完成”的事件通知,所以命名为“完成端口”(Completion Ports)。一个socket被创建后,可以在任何时刻和一个完成端口联系起来。

0 0
原创粉丝点击