在Windows系统里使用完成端口

简介:     在Windows系统里,使用完成端口高性能的方法之一,比如把完成端口使用到线程池和网络服务器里。
    在Windows系统里,使用完成端口高性能的方法之一,比如把完成端口使用到线程池和网络服务器里。现在就通过线程池的方法来介绍怎么样使用完成端口,高性能的服务器以后再仔细地介绍怎么样构造它。其实完成端口一个队列,所有的线程都在等消息出现,如果队列里有消息,就每个线程去获取一个消息执行它。先用函数CreateIoCompletionPort来创建一个消息队列,然后使用GetQueuedCompletionStatus函数来从队列获取消息,使用函数PostQueuedCompletionStatus来向队列里发送消息。通过这三个函数就实现完成端口的消息循环处理。


HANDLE CreateIoCompletionPort(
    HANDLE FileHandle,//关联的文件句柄
    HANDLE ExistingCompletionPort,//已经存在的完成端口
    ULONG_PTR CompletionKey,//传送给处理函数的参数
    DWORD NumberOfConcurrentThreads//有多少个线程在访问这个消息队列
    );


BOOL GetQueuedCompletionStatus(
    HANDLE CompletionPort,//已经存在的完成端口
    LPDWORD lpNumberOfBytesTransferred,
    PULONG_PTR lpCompletionKey,//传送给处理函数的参数
    LPOVERLAPPED *lpOverlapped,//传送给处理函数的参数
    DWORD dwMilliseconds//等待时间
    );


BOOL PostQueuedCompletionStatus(
    HANDLE CompletionPort,
    DWORD dwNumberOfBytesTransferred,//传送了多少个字节
    ULONG_PTR dwCompletionKey,
    LPOVERLAPPED lpOverlapped
    );


//调用函数的例子如下:
#pragma once
#include "Thread.h"


//使用IOCP实现线程池。
class CThreadPools
{
public:
CThreadPools(void)
{
m_nThreadCount = 2;
}


bool Init(void)
{
//创建一个IOCP。
m_hQueue = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, m_nThreadCount);
if (m_hQueue == NULL)
{
//创建IOCP失败。
return false;
}
}


int GetThreadCount(void) const
{
return m_nThreadCount;
}


//线程池处理的内容。
DWORD Run(void)
{
DWORD dwBytesTransfered;
ULONG_PTR dwCompletionKey;
OVERLAPPED* pOverlapped;


//等一个IOCP的消息。
while (GetQueuedCompletionStatus(m_hQueue, &dwBytesTransfered, &dwCompletionKey, &pOverlapped, INFINITE))
{
if (pOverlapped == ((OVERLAPPED*)((__int64)-1)))
{
//退出。
OutputDebugString(_T("退出 /r/n"));
break;
}else{
WPARAM request = (WPARAM) dwCompletionKey;
//处理消息。
OutputDebugString(_T("GetQueuedCompletionStatus /r/n"));
}
}
return 0;
}


//发送处理的消息。
bool QueueRequest(WPARAM wParam)
{        
//往IOCP里发送一条消息。
if (!PostQueuedCompletionStatus(m_hQueue, 0, (ULONG_PTR) wParam, NULL))
return false;
return true;
}


//关闭所有线程。
void Close(void)
{
for (int i = 0; i < m_nThreadCount; i++)
PostQueuedCompletionStatus(m_hQueue, 0, 0, (OVERLAPPED*) ((__int64) -1) );
}


protected:
//接收消息处理的队列。
HANDLE m_hQueue;
//线程个数。
int m_nThreadCount;
};


class CThreads : public CThread
{
public:
CThreads(CThreadPools* pPool)
{
m_pPool = pPool;        
}


protected:
//线程运行函数。
//在这里可以使用类里的成员,也可以让派生类实现更强大的功能。
virtual DWORD Run(void)
{
if (m_pPool)
return m_pPool->Run();
return -1;
}


protected:
CThreadPools* m_pPool;
};



目录
相关文章
|
7月前
|
安全 数据安全/隐私保护 Windows
如何在Windows 10系统中查看已连接WiFi密码-亲测可用-优雅草卓伊凡
如何在Windows 10系统中查看已连接WiFi密码-亲测可用-优雅草卓伊凡
359 15
如何在Windows 10系统中查看已连接WiFi密码-亲测可用-优雅草卓伊凡
|
7月前
|
关系型数据库 虚拟化 UED
Omnissa Horizon Windows OS Optimization Tool 2503 - Windows 系统映像优化工具
Omnissa Horizon Windows OS Optimization Tool 2503 - Windows 系统映像优化工具
303 7
Omnissa Horizon Windows OS Optimization Tool 2503 - Windows 系统映像优化工具
|
2月前
|
运维 安全 Linux
【清爽加速】Windows 11 Pro 24H2-Emmy精简系统
“清爽加速”Windows 11 Pro 24H2 针对老旧或低配设备,通过精简系统、优化服务与简化装机流程,降低资源占用,提升运行流畅度,兼顾安全性与稳定性,让老设备也能轻松应对日常办公与轻度娱乐需求。
【清爽加速】Windows 11 Pro 24H2-Emmy精简系统
|
2月前
|
安全 数据安全/隐私保护 Windows
ZyperWin++使用教程!让Windows更丝滑!c盘飘红一键搞定!ZyperWin++解决系统优化、Office安装和系统激活
ZyperWin++是一款仅5MB的开源免费Windows优化工具,支持快速优化、自定义设置与垃圾清理,兼具系统加速、隐私保护、Office安装等功能,轻便无广告,小白也能轻松上手,是提升电脑性能的全能管家。
930 0
|
2月前
|
安全 搜索推荐 开发者
【适度精简】Windows 7 旗舰版-emmy精简系统
Windows 7旗舰版因硬件占用高、冗余组件多、兼容性差及缺乏安全更新等问题,逐渐难以满足用户需求。适度精简版通过去除无用组件、优化性能与安全性,提升老旧设备运行效率,增强兼容性与稳定性,同时保留用户熟悉的操作界面,降低学习成本,满足个性化需求,延续Windows 7的实用价值。
|
3月前
|
Ubuntu Linux Windows
windows11系统安装ubuntu系统详细步骤
安装后,您可以直接从商店启动应用程序来源
692 0
|
5月前
|
Ubuntu Linux 数据安全/隐私保护
Windows中安装WSL 2和Ubuntu系统的教程
回看这一路,有趣吧?你已经跨界成为了一个Windows和Linux的桥梁。期待在代码的世界里,把一切玩得风生水起!
302 13
|
4月前
|
持续交付 Windows
如何使用Sysprep准备Windows系统并使用自动应答
通过Sysprep准备Windows系统,可实现SID重置与系统定制。进入Sysprep后,可安装软件、设置默认桌面文件,并使用Windows SIM创建应答文件以实现自动化部署。适用于系统克隆与批量部署场景。
|
6月前
|
JSON 安全 数据可视化
Elasticsearch(es)在Windows系统上的安装与部署(含Kibana)
Kibana 是 Elastic Stack(原 ELK Stack)中的核心数据可视化工具,主要与 Elasticsearch 配合使用,提供强大的数据探索、分析和展示功能。elasticsearch安装在windows上一般是zip文件,解压到对应目录。文件,elasticsearch8.x以上版本是自动开启安全认证的。kibana安装在windows上一般是zip文件,解压到对应目录。elasticsearch的默认端口是9200,访问。默认用户是elastic,密码需要重置。
3221 0
|
9月前
|
Windows
windows查看端口占用情况
windows查看端口占用情况
515 9

热门文章

最新文章