多线程CInternetSession启动一定次数后失败

wj_wjian 2015-04-23 11:44:40
我用下面的方法启动线程,在线程中用CInternetSession获取url数据
for (int i = 0; i < threadStartCount; i++)
{
CoInitializeEx(NULL, COINIT_MULTITHREADED);
DWORD ThreadID; //线程ID
HANDLE Thread;
Thread = CreateThread( //创建线程,返回线程句柄,并指向线程启动函数
0, //默认安全级别,不允许有子进程
0, //堆栈大小默认,与主线程栈大小一样
thread, //线程入口函数
(LPVOID)l, //参数
0, //创建时的状态
&ThreadID //获得线程ID
);
threadsHandle[i] = Thread;
Threads[i] = ThreadID;
//CloseHandle(Thread);
}


完成后,这样结束
for (int i = 0; i < threadStartCount; i++)
{
TerminateThread(threadsHandle[i], Threads[i]);
CloseHandle(threadsHandle[i]);
}

如果返回结束10次之后,再次用启动线程的时候,线程可以正常启动,但CInternetSession获取不到数据,也没有抛异常。
下面是请求及获取数据的代码:
CString html = _T("");
try {
//AfxMessageBox(html);
CString url;
url = l.url.c_str();
pServer = m_InetSession->GetHttpConnection(url);
pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST, l.objectName);
pFile->SendRequest(l.headers, (LPVOID)postData.c_str(), postData.length());
DWORD dwRet;
pFile->QueryInfoStatusCode(dwRet);
if (dwRet == HTTP_STATUS_OK) {
char strBuff[1025] = { 0 };
string strHtml; //是string 不是CString
while ((pFile->Read((void*)strBuff, 1024)) > 0)
{
strHtml += strBuff;
}
// _cprintf("\n读取内容结束...");

int unicodeLen = MultiByteToWideChar(CP_ACP, 0, strHtml.c_str(), -1, NULL, 0);
WCHAR *pUnicode = new WCHAR[unicodeLen + 1];
memset(pUnicode, 0, (unicodeLen + 1)*sizeof(wchar_t));

MultiByteToWideChar(CP_ACP, 0, strHtml.c_str(), -1, pUnicode, unicodeLen);
CString str(pUnicode); //这就是要的内容
html = str;
delete[]pUnicode;

}
delete pFile;
delete pServer;
}
catch (CInternetException* e) {
e->m_dwContext;
throw e;
}


各们帮忙给看看什么原因,多谢。
...全文
202 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wj_wjian 2015-04-23
  • 打赏
  • 举报
回复
通过任务管理器查看进程数是在pFile->SendRequest(l.headers, (LPVOID)postData.c_str(), postData.length());之后,进程数增加5-6个进程数,不知道这样增加的进程数如何删除,麻烦高手帮忙看看,多谢了。
wj_wjian 2015-04-23
  • 打赏
  • 举报
回复
赐才

引用 6 楼 zhao4zhong1 的回复:
检查是否资源泄漏的办法之一:
在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象
让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!


刚才按你的方法设置了一下任务管理器,看到下面的结果。


启动1个线程后,线程一下从2个变成了9个,这是为什么啊。
结束后,还剩8个在执行。
执行完10次后,线程数还在增加(1次性启动10个线程),但是抓包的时候,是没有发送和接收数据的。
wj_wjian 2015-04-23
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
检查是否资源泄漏的办法之一:
在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象
让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!


我刚试了下,用GdiLeakDetector工具打开测试的时候不停的开始结束,居然可以启动很多次。但是不用这个工具启动的时候只能启动10次。
另外,我分别在2台VPS(2003)里试了下,有一台能启动10次,有一台只能启动2次。
xp和win7可以启动10次。
测试结果中有Exception出现,跟这有没有关系
赵4老师 2015-04-23
  • 打赏
  • 举报
回复
检查是否资源泄漏的办法之一: 在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!
赵4老师 2015-04-23
  • 打赏
  • 举报
回复
wj_wjian 2015-04-23
  • 打赏
  • 举报
回复
引用 2 楼 oyljerry 的回复:
可以抓包看看,看你是否有收到响应的数据
我抓过,连发送都没有发出去。更不用说接收的数据了。
wj_wjian 2015-04-23
  • 打赏
  • 举报
回复
引用 1 楼 wj_wjian 的回复:
在线等,求大神帮忙给看看
我抓过,连发送都没有发出去。更不用说接收的数据了。
oyljerry 2015-04-23
  • 打赏
  • 举报
回复
可以抓包看看,看你是否有收到响应的数据
wj_wjian 2015-04-23
  • 打赏
  • 举报
回复
在线等,求大神帮忙给看看

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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