狂人呓语

主线程向多线程传递CString报错的问题解决

为什么我在一个对话框类的函数里面启动一个线程的时候,将一个CString 类型的字符串当作参数传给了线程,在线程里面将该字符串取出来进行赋值给另外一个字符串的时候运行到那儿的时候系统会报错警告???(注:编译链接都没有问题,运行途中突然报错警告停止···)

自问自答:

这是因为错误的原因很可能是当线程需要用到该变量时,主线程中已将该变量销毁,这是大数多做线程的人容易犯的错误
解决的办法可将该变量定义为全局变量!

在最外面定义变量new一个 CString *pstr = new CString; 然后直接是用,即这个pstr既可以在主函数使用也可以在线程还是里面直接使用··· 注意最后退出时候记着delete释放空间有几个别人给的参考: 不要使用CString传递参数到thread中,正确方法如下:
1、先申请内存给字符串A(new)
2、启动线程,将A作为参数传入
3、线程处理完后,销毁A即可(delete) 用new/delete来创建和销毁内存即可!
[code]CString *pstr = new CString;
DWORD ThreadTest(LPVOID lpData)
{
CString *pstr = (CString*)lpData; .... delete pstr ;
}[/code]

也在多线程时最好不要用CString,因为MSDN明确说了,CString类是非线程安全的

以上是摘抄的,到论坛看了一下,下面的这些回复或许有用
[quote]CString只保证类级的线程安全,
要做到对象级别的线程安全,需要你自己进行同步,
也就是说,
可以同时有N个线程在读,
但是写的时候,必须保证没有任何线程"正在"读和写
才可以写入.
CString str;

CCriticalSection cs;
cs->Lock( );
str+="abcdefg";........
do anything you want
cs->Unlock( ); [/quote]

未经允许不得转载:狂人呓语 » 主线程向多线程传递CString报错的问题解决

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址