再线程中,用到类中的一个CString类型的 公共变量,这个变量与EDIT控件关联
在线程中,一运行到读取这个变量的值的时候就出错
代码例子:
//线程函数内
CxxDlg *obj = (CxxDlg *)lParam; //lParam为创建线程时传递的参数
CString str = obj->m_path; //出错位置
调试了一下,发现是CString出得错,把出错的内部代码贴出来:
const CString& CString::operator=(const CString& stringSrc)
{
if (m_pchData != stringSrc.m_pchData)
{
if ((GetData()->nRefs < 0 && GetData() != _afxDataNil) ||
stringSrc.GetData()->nRefs < 0)
{
// actual copy necessary since one of the strings is locked
AssignCopy(stringSrc.GetData()->nDataLength, stringSrc.m_pchData);
}
else
{
// can just copy references around
Release();
ASSERT(stringSrc.GetData() != _afxDataNil);
m_pchData = stringSrc.m_pchData;
InterlockedIncrement(&GetData()->nRefs);
}
}
return *this;
}
请求各位大虾帮忙!
13 个解决方案
#1
obj->m_path 出什么错?把错误贴出来看下!
m_path 是什么类型的?莫非是const?
m_path 是什么类型的?莫非是const?
#2
楼主把错误信息也贴出来吧,看看是什么原因。
#3
要看的是线程调用的地方,不是线程内部。
#4
obj->m_path的问题,不是CString 的问题
#5
1)不应该在线程内执行的代码你执行了,MFC的有些东西,每个线程都要初期化
2)你给的信息还是不足,可能是你代码的其他部分有问题
3)如果想绕开,可以在线程内发消息,让主线程来执行(前提是没有2的问题)
2)你给的信息还是不足,可能是你代码的其他部分有问题
3)如果想绕开,可以在线程内发消息,让主线程来执行(前提是没有2的问题)
#6
肯定不是CString 的错误,
应该是obj->m_path的错误
应该是obj->m_path的错误
#7
检查一下lParam参数是否传对了.
#8
CString str = obj->m_path; //出错位置
还是写一个Get函数吧,别直接这个把一个成员变量扔出来
还是写一个Get函数吧,别直接这个把一个成员变量扔出来
#9
CString不是线程安全的
跨模块、跨线程时,用char *或BSTR
跨模块、跨线程时,用char *或BSTR
#10
lParam这个参数是什么?
this指针?
this指针?
#11
不好意思,忘记说明了,m_path就是CString类型的
#12
你再检查下你的obj->m_path 如果真的是Cstring类型的是不会报错的。
确认
确认
#13
还有就是跟踪下你的obj指针,如果指针错了不是对话框指针,那么肯定也会出错。
#1
obj->m_path 出什么错?把错误贴出来看下!
m_path 是什么类型的?莫非是const?
m_path 是什么类型的?莫非是const?
#2
楼主把错误信息也贴出来吧,看看是什么原因。
#3
要看的是线程调用的地方,不是线程内部。
#4
obj->m_path的问题,不是CString 的问题
#5
1)不应该在线程内执行的代码你执行了,MFC的有些东西,每个线程都要初期化
2)你给的信息还是不足,可能是你代码的其他部分有问题
3)如果想绕开,可以在线程内发消息,让主线程来执行(前提是没有2的问题)
2)你给的信息还是不足,可能是你代码的其他部分有问题
3)如果想绕开,可以在线程内发消息,让主线程来执行(前提是没有2的问题)
#6
肯定不是CString 的错误,
应该是obj->m_path的错误
应该是obj->m_path的错误
#7
检查一下lParam参数是否传对了.
#8
CString str = obj->m_path; //出错位置
还是写一个Get函数吧,别直接这个把一个成员变量扔出来
还是写一个Get函数吧,别直接这个把一个成员变量扔出来
#9
CString不是线程安全的
跨模块、跨线程时,用char *或BSTR
跨模块、跨线程时,用char *或BSTR
#10
lParam这个参数是什么?
this指针?
this指针?
#11
不好意思,忘记说明了,m_path就是CString类型的
#12
你再检查下你的obj->m_path 如果真的是Cstring类型的是不会报错的。
确认
确认
#13
还有就是跟踪下你的obj指针,如果指针错了不是对话框指针,那么肯定也会出错。