MFC多线程问题

u010269599 2015-04-10 11:19:19
新手,MFC的一个小东西,用了iwebbrowser2浏览网页的插件,要实现一个定时刷新页面的效果,建立了多线程,可是会提示内存冲突 异常代码0xC0000005 写入位置0x00000034时发生错误,不知道为什么会出现这样非法访问的问题,下面是关键代码,以及错误信息,恳请高手指点

//这部分是线程函数
static DWORD WINAPI GoRefresh(void *pArg) //刷新消息函数
{
IWebBrowser2* pWebBrowser = (IWebBrowser2*)pArg;

while (1)
{
pWebBrowser->Refresh();
Sleep(30000);
}
return 0;
}

//窗口类中的public定义插件
IWebBrowser2 *pWebBrowser=NULL;

//下面是插件相关的代码,在这里建立的线程
CActiveXUI* pActiveXUI3 = static_cast<CActiveXUI*>(m_PaintManager.FindControl(_T("ActiveXDemo3")));
if (pActiveXUI3)
{
IWebBrowser2* pWebBrowser = NULL;
//pWebBrowser->put_Silent(VARIANT_TRUE);
pActiveXUI3->SetDelayCreate(false);
pActiveXUI3->CreateControl(CLSID_WebBrowser);
pActiveXUI3->GetControl(IID_IWebBrowser2, (void**)&pWebBrowser);
if (pWebBrowser != NULL)
{

pWebBrowser->put_Silent(VARIANT_TRUE);
pWebBrowser->Navigate(L"http://www.baidu.com/", NULL, NULL, NULL, NULL);
DWORD dwThreadID = 0;
HANDLE hThread = CreateThread(NULL, 0, GoRefresh, (void*)pWebBrowser, NULL, &dwThreadID);//创建请求线程
////////////等待线程结束

DWORD dRet;
MSG msg;
while (1)
{
dRet = ::MsgWaitForMultipleObjects(1, &hThread, FALSE, INFINITE, QS_ALLINPUT);
if (dRet == WAIT_OBJECT_0 + 1)
{
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else
{
break;
}
}

//删除的线程资源。
CloseHandle(hThread);
//AfxBeginThread(CDuiFrameWnd::getrefresh,this);
pWebBrowser->Release();
}
}


关键代码就是这些了,如果需要其他的,可以留言,我贴上来,下面是错误信息
_RtlEnterCriticalSection@4:
76FD22C0 mov edi,edi
76FD22C2 push ebp
76FD22C3 mov ebp,esp
76FD22C5 sub esp,0Ch
76FD22C8 push esi
76FD22C9 push edi
76FD22CA mov edi,dword ptr [ebp+8]
76FD22CD lea esi,[edi+4]
76FD22D0 mov eax,esi
76FD22D2 lock btr dword ptr [eax],0 (在这里中断的)
76FD22D7 jae _RtlEnterCriticalSection@4+102BBh (76FE257Bh)
76FD22DD mov eax,dword ptr fs:[00000018h]
76FD22E3 mov ecx,dword ptr [eax+24h]
76FD22E6 mov dword ptr [edi+0Ch],ecx
76FD22E9 mov dword ptr [edi+8],1
76FD22F0 pop edi
76FD22F1 xor eax,eax
76FD22F3 pop esi
76FD22F4 mov esp,ebp
76FD22F6 pop ebp
76FD22F7 ret 4
76FD22FA nop
76FD22FB nop
76FD22FC nop
76FD22FD nop
76FD22FE nop


恳请赐教!不甚感激
...全文
163 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2015-04-10
  • 打赏
  • 举报
回复
不要在多线程中访问Webbrowser,可能有问题 你可以多线程中PostMessage方式发送消息给主线程,由主线程来操作Webbrowser控件
u010269599 2015-04-10
  • 打赏
  • 举报
回复
没有人吗?
Eleven 2015-04-10
  • 打赏
  • 举报
回复
改用在线程中PostMessage一个自定义的消息到UI线程,在UI线程的自定义消息响应函数中去更新控件的处理。
xinxizixun 2015-04-10
  • 打赏
  • 举报
回复
建议 ontimer
oyljerry 2015-04-10
  • 打赏
  • 举报
回复
引用 5 楼 u010269599 的回复:
[quote=引用 2 楼 oyljerry 的回复:] 不要在多线程中访问Webbrowser,可能有问题 你可以多线程中PostMessage方式发送消息给主线程,由主线程来操作Webbrowser控件
是因为在Sleep 中 占用了控件资源,所以主线程阻塞了?[/quote] 是控件就不建议多线程访问
u010269599 2015-04-10
  • 打赏
  • 举报
回复
引用 2 楼 oyljerry 的回复:
不要在多线程中访问Webbrowser,可能有问题 你可以多线程中PostMessage方式发送消息给主线程,由主线程来操作Webbrowser控件
是因为在Sleep 中 占用了控件资源,所以主线程阻塞了?
u010269599 2015-04-10
  • 打赏
  • 举报
回复
引用 2 楼 oyljerry 的回复:
不要在多线程中访问Webbrowser,可能有问题 你可以多线程中PostMessage方式发送消息给主线程,由主线程来操作Webbrowser控件
另外还是想请教一下,当多线程sleep的时候,为何主线程也停止了,连窗口创建都创建不了了?这也是因为在多线程中操作控件导致的吗?
u010269599 2015-04-10
  • 打赏
  • 举报
回复
引用 2 楼 oyljerry 的回复:
不要在多线程中访问Webbrowser,可能有问题 你可以多线程中PostMessage方式发送消息给主线程,由主线程来操作Webbrowser控件
好的,我试试,谢谢

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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