完成端口模型,PostQueuedCompletionStatus后,GetQueuedCompletionStatus不响应,详见内容

whichname 2011-04-13 06:30:36
大致代码如下:
#define THREAD_NUM (3) //线程数

typedef unsigned int DIS_ID_t;

enum TIMER_TYPE
{
E_TIMER_1,
E_TIMER_2,
E_TIMER_3,
};

class CPrint
{
public:
CPrint()
{
InitializeCriticalSection( &m_cs );
}

~CPrint()
{
DeleteCriticalSection( &m_cs );
}

void Print(std::string str)
{
::EnterCriticalSection(&m_cs);
std::cout << str.c_str() << std::endl;
::LeaveCriticalSection(&m_cs);
}

static CPrint *Instannce()
{
if (NULL == m_CPrint)
{
return m_CPrint = new CPrint;
}

return m_CPrint;
}

private:
static CPrint *m_CPrint;
CRITICAL_SECTION m_cs;
};

CPrint *CPrint::m_CPrint = NULL;

DWORD __stdcall ThreadPro( void* pArguments );
class CThread
{
public:
CThread()
{
}

~CThread()
{
}

void InitData(void)
{
m_hThreadPool = CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,NULL,0);
for (int i=0; i<THREAD_NUM; i++)
{
m_Thread[i] = CreateThread( NULL,0,ThreadPro,NULL,0,NULL );
}
}

static HANDLE m_hThreadPool;
static OVERLAPPED m_ThreadOvl;
private:
HANDLE m_Thread[THREAD_NUM];
};

HANDLE CThread::m_hThreadPool = NULL;
OVERLAPPED CThread::m_ThreadOvl;

DWORD __stdcall ThreadPro( void* pArguments )
{
while (1)
{
DWORD dwTrans;
DWORD dwKey;
LPOVERLAPPED ovlop;
BOOL bRet = GetQueuedCompletionStatus( CThread::m_hThreadPool,&dwTrans,(PULONG_PTR)&dwKey,&ovlop,INFINITE );
if(bRet)
{
DIS_ID_t disID = *((DIS_ID_t *)dwKey);

if (disID == E_TIMER_1)
{
CPrint::Instannce()->Print("++++++++定时器1");
}
else if (disID == E_TIMER_2)
{
CPrint::Instannce()->Print("++++++++定时器2");
}
else
{
CPrint::Instannce()->Print("++++++++定时器3");
}
}
else
{
break;
}
}

return 0;
}

struct stTimer
{
DIS_ID_t m_Type;
DWORD m_LastTime;
DWORD m_Interval;
};

int _tmain(int argc, _TCHAR* argv[])
{
CThread thread;
thread.InitData();

std::vector<stTimer> timerList;

stTimer timer1,timer2,timer3;

DWORD initTime = (DWORD)time(NULL);
timer1.m_LastTime = initTime;
timer1.m_Interval = 10; //10秒
timer1.m_Type = E_TIMER_1;

initTime = (DWORD)time(NULL);
timer2.m_LastTime = initTime;
timer2.m_Interval = 60; //60秒
timer2.m_Type = E_TIMER_2;

initTime = (DWORD)time(NULL);
timer3.m_LastTime = initTime;
timer3.m_Interval = 60; //60秒
timer3.m_Type = E_TIMER_3;

timerList.push_back(timer1);
timerList.push_back(timer2);
timerList.push_back(timer3);

unsigned int i = 0;
while (i < 0xffff)
{
DWORD curTime = (DWORD)time(NULL);
std::vector<stTimer>::iterator it = timerList.begin();
for (; it != timerList.end(); it++)
{
DWORD interval = curTime - it->m_LastTime;
if (interval > it->m_Interval)
{
DIS_ID_t disID = it->m_Type;
PostQueuedCompletionStatus( CThread::m_hThreadPool,sizeof(disID),(DWORD)(INT_PTR)&disID,&CThread::m_ThreadOvl);
it->m_LastTime = curTime;

if (it->m_Type == E_TIMER_1)
{
CPrint::Instannce()->Print("---------------定时器1");
}
else if (it->m_Type == E_TIMER_2)
{
CPrint::Instannce()->Print("---------------定时器2");
}
else
{
CPrint::Instannce()->Print("---------------定时器3");
}
}
}

if ((i % 8) == 0)
{
CPrint::Instannce()->Print("oooooooooo");
}

i++;
Sleep(1000);
}

return 0;
}


在CThread::InitData(void)中创建了3个工作线程,
在主线程中设置3个定时器,

当时间到了就执行PostQueuedCompletionStatus,
工作线程响应。

现在的问题是:
当定时器E_TIMER_2, E_TIMER_3设置时间间隔一样,切启动时间一样
则可能会出现问题:定时器E_TIMER_2不响应,但定时器可能会响应2次,
怀疑是控制台输出的原因,但控制台输出都加了锁,
且在定时器E_TIMER_2的响应代码处段点在连续多个时间间隔都不会触发,之后也许很久会触发一次

感觉有点诡异,请不吝赐教!!!
...全文
174 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
whichname 2011-04-14
  • 打赏
  • 举报
回复
自己顶下
whichname 2011-04-13
  • 打赏
  • 举报
回复
补充:可以确认是调用了PostQueuedCompletionStatus的

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧