IO完成端口的使用
2016-07-15 00:00
197 查看
摘要: IO完成端口的使用
使用完成端口分以下三部分
1.创建完成端口
2.创建线程
3.将任务交到队列中
4.POST完成端口状态
5.线程取得完成端口状态,关做出处理操作
//完成端口句柄
HANDLE m_hRequestQueue;
std::list<CTaskBase*> m_lstTask;
static DWORD WINAPI WorkerThreadProc(LPVOID pv);
//CHN 线程回调函数
DWORD ThreadProc();
CCriticalSection m_locktTask;
static DWORD WINAPI WorkerThreadProc(LPVOID pv);
void CIPCP_DlgDlg::OnBnClickedOk()
{
int nThreadNum = 3;
//创建完成端口
m_hRequestQueue = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, nThreadNum);
DWORD dwThreadID;
//创建3个线程
for (int i=0; i<nThreadNum; i++)
{
HANDLE hdlThread = CreateThread(NULL, 0, WorkerThreadProc, (LPVOID)this, 0, &dwThreadID);
CString strTemp;
strTemp.Format(_T("Thread ID = %d\n"), dwThreadID);
OutputDebugString(strTemp);
}
for (int i=0; i<1000; i++)
{
//生成1000个任务
CTaskBase* pTask = new CTaskBase(i);
m_locktTask.Lock();
m_lstTask.push_back(pTask);
m_locktTask.Unlock();
PostQueuedCompletionStatus(m_hRequestQueue, 0, (ULONG_PTR)pTask, NULL);
}
}
DWORD WINAPI CIPCP_DlgDlg::WorkerThreadProc( LPVOID pv )
{
CIPCP_DlgDlg* pThis =
reinterpret_cast< CIPCP_DlgDlg* >(pv);
return pThis->ThreadProc();
return 0;
}
DWORD CIPCP_DlgDlg::ThreadProc()
{
DWORD dwBytesTransfered;
ULONG_PTR dwCompletionKey;
OVERLAPPED* pOverlapped;
//CHN 从IO完成端口获取请求,当IO完成端口关闭或收到关闭请求时退出线程
while (GetQueuedCompletionStatus(m_hRequestQueue, &dwBytesTransfered, &dwCompletionKey, &pOverlapped, INFINITE))
{
m_locktTask.Lock();
CTaskBase* p = m_lstTask.back();
m_lstTask.pop_back();
m_locktTask.Unlock();
//CHN 获取到关闭请求
p->DoTask();
}
return TRUE;
}
使用完成端口分以下三部分
1.创建完成端口
2.创建线程
3.将任务交到队列中
4.POST完成端口状态
5.线程取得完成端口状态,关做出处理操作
//完成端口句柄
HANDLE m_hRequestQueue;
std::list<CTaskBase*> m_lstTask;
static DWORD WINAPI WorkerThreadProc(LPVOID pv);
//CHN 线程回调函数
DWORD ThreadProc();
CCriticalSection m_locktTask;
static DWORD WINAPI WorkerThreadProc(LPVOID pv);
void CIPCP_DlgDlg::OnBnClickedOk()
{
int nThreadNum = 3;
//创建完成端口
m_hRequestQueue = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, nThreadNum);
DWORD dwThreadID;
//创建3个线程
for (int i=0; i<nThreadNum; i++)
{
HANDLE hdlThread = CreateThread(NULL, 0, WorkerThreadProc, (LPVOID)this, 0, &dwThreadID);
CString strTemp;
strTemp.Format(_T("Thread ID = %d\n"), dwThreadID);
OutputDebugString(strTemp);
}
for (int i=0; i<1000; i++)
{
//生成1000个任务
CTaskBase* pTask = new CTaskBase(i);
m_locktTask.Lock();
m_lstTask.push_back(pTask);
m_locktTask.Unlock();
PostQueuedCompletionStatus(m_hRequestQueue, 0, (ULONG_PTR)pTask, NULL);
}
}
DWORD WINAPI CIPCP_DlgDlg::WorkerThreadProc( LPVOID pv )
{
CIPCP_DlgDlg* pThis =
reinterpret_cast< CIPCP_DlgDlg* >(pv);
return pThis->ThreadProc();
return 0;
}
DWORD CIPCP_DlgDlg::ThreadProc()
{
DWORD dwBytesTransfered;
ULONG_PTR dwCompletionKey;
OVERLAPPED* pOverlapped;
//CHN 从IO完成端口获取请求,当IO完成端口关闭或收到关闭请求时退出线程
while (GetQueuedCompletionStatus(m_hRequestQueue, &dwBytesTransfered, &dwCompletionKey, &pOverlapped, INFINITE))
{
m_locktTask.Lock();
CTaskBase* p = m_lstTask.back();
m_lstTask.pop_back();
m_locktTask.Unlock();
//CHN 获取到关闭请求
p->DoTask();
}
return TRUE;
}
相关文章推荐
- php进程SIGBUS,SIGSEGV错误
- ThinkPHP2.2 任意代码执行漏洞 利用
- 飞信系统4月29日升级后飞信机器人无法使用的解决办法
- Lucene6.0学习笔记——建立索引
- 学学Java Servlet:servlet的简介
- Java线程中run和start方法的区别
- 移动端WEB调试
- Way.js Vue.js Avalon.js Pat.js Jquery.my
- 禁止RecycleView的滑动
- 关于ODBC api 执行sqlserver存储过程的问题
- oracle存储过程
- 适用于spring项目的httpinvoker接口
- junit常用注解详细说明
- java程序的耦合度是什么
- 二分查找以及二分查找的时间复杂度
- 一些常用的eclipse技巧~没见过的,知道的省掉自己查~
- JOIN关联表中ON,WHERE后面跟条件的区别
- 判断手机是否安装高德/百度地图
- 自动生成
- 浏览器表单提交不支持put与delete方法