线程函数里面调用CEdit对象就报错?

USTCwangjian 2017-11-14 05:34:57
小弟创建两个PC间的蓝牙通信
头文件
public:
afx_msg void OnBnClickedButton1();
CEdit m_edit1;
CEdit m_edit2;
afx_msg void OnEnChangeEdit2();
afx_msg void OnBnClickedStart();

CButton m_button_say;

CWinThread* hThread0;
CWinThread* hThread1;
SOCKET sock;
static UINT _cdecl onListen0(LPVOID lpvThreadParm);
static UINT _cdecl onRecieve1(LPVOID lpvThreadParm);
线程函数:
/////服务器监听线程/////
UINT CBLUETOOTHDlg::onListen0(LPVOID lpvThreadParm)
{
// CBLUETOOTHDlg m_blu;

CBLUETOOTHDlg*pthis = (CBLUETOOTHDlg*)lpvThreadParm;
// pthis->OnBnClickedStart();
SOCKADDR_BTH sa;
int sa_len = sizeof(sa);
while (1)
{
memset(&sa, 0, sa_len);
pthis->sock = accept(sockTCP, (LPSOCKADDR)&sa, &sa_len);
if (SOCKET_ERROR == pthis-> sock)
{
//AfxMessageBox("sock监听套接字失败!");
}
else//连接成功
{

pthis->m_edit1.SetSel(pthis->m_edit1.GetWindowTextLengthA(), pthis->m_edit1.GetWindowTextLengthA());
pthis->m_edit1.ReplaceSel("客户端连接成功!");
pthis->m_button_say.EnableWindow(TRUE);
pthis->hThread1->ResumeThread();
pthis->bThread1 = TRUE;
pthis->hThread1 = AfxBeginThread(onRecieve1, lpvThreadParm, THREAD_PRIORITY_NORMAL, 0, 0, NULL);
}

为什么pthis指针一调用m_edit1就报错:0xC0000005: 读取位置 0x00000048 时发生访问冲突。
...全文
280 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2017-11-17
  • 打赏
  • 举报
回复
MFC类非线程安全的,不要在线程函数中直接去访问UI线程中的控件信息。
smwhotjay 2017-11-17
  • 打赏
  • 举报
回复
子线程不能直接操作ui 安卓也是, 绕过的办法就是传递消息。安卓是用handler ,win32用postmessage
赵4老师 2017-11-16
  • 打赏
  • 举报
回复
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx
oyljerry 2017-11-16
  • 打赏
  • 举报
回复
PostMessage发消息给主线程,然后主线程来操作控件CEdit
真相重于对错 2017-11-14
  • 打赏
  • 举报
回复
后台线程不允许直接访问界面,最好通过发送消息的方式

15,471

社区成员

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

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