CInternetSession OpenURL没反应,不能捕获异常

文章描述了一个C++程序在访问URL时出现的异常情况,问题源在于一个同时运行的线程。当调用AfxBeginThread创建线程后,访问URL的功能出现故障。调试发现,线程回调函数中的状态变量m_bOK被设置为FALSE,导致程序异常。修复方法是确保在调用线程之前正确设置该变量。
摘要由CSDN通过智能技术生成

本文迁移自本人网易博客,写于2013年10月22日

CString sFileName;

CInternetSession iSession;

BOOL bRet = FALSE;

CStdioFile* pFileDown = NULL;

try

{

pFileDown = iSession.OpenURL(szURL, 1, INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_DONT_CACHE);

}

catch(...)

{

CString sUrl = szURL;

CString sTemp = sUrl.MakeUpper();

CString sFindString = _T("/LiveUpdate/autoupdate.cgi");

sFindString.MakeUpper();

CString sShowMsg = _T("");

if (sTemp.Find(sFindString) > 0)

{

sShowMsg = sUrl.Left(sTemp.Find(sFindString));

}

AfxMessageBox("访问自动更新服务器" + sShowMsg + "失败,请检查网络是否可访问!",MB_OK|MB_ICONERROR);

//return FALSE;

}

原因:在访问URL之前使用了线程:

AfxBeginThread(WatchThreadProc,this);

将它去掉就恢复正常了,但是不明白为什么之前用了很久都没问题,最近怎么都出问题了;

而且去掉这个线程后,访问URL后异常弹出的等待时间比较长。

Debug调试时,程序运行到CThreadSlotData::GetThreadValue函数的ASSERT(m_pSlotData[nSlot].dwFlags & SLOT_USED);这一行时,异常了:

出错,弹出消息框如下所示:

错误原因:程序调用这个函数的时候,不符合他的条件

UINT WatchThreadProc(LPVOID p)

{

Sleep(10000);

if(((CLiveUpdateApp*)p)->m_bOK==FALSE)

{

ExitProcess(0);

}

return 0;

}

线程回调函数里头设置的m_bOK为FALSE时,跳出,而程序取在调用线程之前将其设置为FALSE,导致程序异常,将其置为TRUE后正常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值