您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: