我写了一个程序,用来截获http请求处理并返回,采用多线程。可程序总在持续一段时间后出现cpu持续超过90%不降下来,我找了几天都不知道哪里出了问题,代码如下:
try 
{

//开始侦听连接请求
if(!g_sListen.Accept(sConnect, saClient)) 
{
//在应用程序关闭时的处理
g_bListening=FALSE;
delete [] buffer;
return 0;
}
//连接数增加一个
g_nConnection++;
//开始另一个服务器线程
AfxBeginThread(ServerThreadProc, pParam, THREAD_PRIORITY_NORMAL);
//从客户端(浏览器)读取请求
sConnect.ReadHttpHeaderLine(request1, MAXLINELENGTH, 10);
//解析请求并作相应的处理
if(Parse(request1, &pToken1, &pToken2))
{
//浏览器GET方式
if(!stricmp(pToken1, "GET")) 
{

do 
{
//读取请求的剩余部分
sConnect.ReadHttpHeaderLine(request2, MAXLINELENGTH, 10);
}
while(strcmp(request2, "\r\n"));
                                     (处理程序)
{
CCriticalSection::Owner lock(g_criticalSection2);
wsprintf(headers, hdrFmt, (const char*) strGmtNow, strCon.length());
strcat(headers, "\r\n");
sConnect.Write(headers, strlen(headers), 10);
sConnect.Write(strCon.c_str(),strCon.length(),10);

}
}
else 
{
//其它的请求方式
}
}
else 
{
//错误的请求
}
//关闭套接字
Sleep(1);
sConnect.Close();
}
catch(CMyBlockSocketException* pe)
{
//错误处理
pe->Delete();
}
delete [] buffer;
if(pFile) delete pFile;
return 1;处理程序没问题,应为我另外还有写一个类似的程序,不过是使用消息队列,两者具体的处理是一样的,而那个程序没有这种问题。
另外,当cpu持续过高的时候程序并没死,还会处理新的请求。而且请求的客户端也都得到返回,所以我一直无法确定是什么情况引起的。
而且,这个问题只发生在很多用户持续发请求的时候。
请高手帮帮我吧,老板要我解决这个问题,我都三天了还是搞不定,这样下去我惨了T^T,拜托了!!!

解决方案 »

  1.   

    只能说一个让楼主试试在while循环里加上
    sleep(1000)
      

  2.   

    建议你分两个THERAD来做
    一个负责截获,一个负责分析
      

  3.   

    消息的话可能处理的效率没有那么高而已(没处理完的都在队列里),线程处理的多些cpu占用上去了很正常的。
      

  4.   

    Debug状态下CPU很高的时候暂停运行,看看程序到底在干什么。
      

  5.   

    ServerThreadProc里有没有费时的操作呢?
      

  6.   

    上面那段就是ServerThreadProc的主要代码了,sleep我用了,可没用啊!
      

  7.   

    如windcsn(向所有的朋友学习!)所说 :建议你分两个THERAD来做
    一个负责截获,一个负责分析我认为
    你建2个线程
    1#负责截获并把请求填进一个队列里
    2#不停的从队列里取得请求2者之间的驱动关系是事件驱动
    2# 循环 waitforsingleobject
    1# 有了请求就setevent