求指点线程对VCL控件操作的问题。

stbigcrab 2011-10-07 11:23:39
因为少用线程,近期恰好要用到线程访问一个Memo控件。
其实也就是把线程里面的信息写入Memo。

经常看到vcl是多线程不安全的,我想请问各位前辈,几个线程同时写Memo,问题主要会出现在什么地方?
我尝试用两个线程写信息到Memo,大概两个线程一秒写一次,测试了几次都没发生问题,请问这种做法有什么需要注意的地方?或者说有潜在的隐患只是我暂时还没遇到。

另我用CreateThread创建线程的。

我在bcb6里面,在线程循环里面处理一些数字,如果在没中断情况下退出程序,就会抛出异常。
但是不在IDE环境下就没问题,请问这种异常情况是不是IDE的本身问题?

感谢各位指点!
...全文
208 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzbinfo 2011-10-12
  • 打赏
  • 举报
回复
VCL
界面控件不是线程安全的,不建议在线程里面操作,到时候会引起莫名其妙的问题.建议你线程里面处理数据然后发消息给窗体,窗体收到消息在界面上显示.
lhy 2011-10-12
  • 打赏
  • 举报
回复
用TThread吧。
stbigcrab 2011-10-11
  • 打赏
  • 举报
回复
有没有哪位同学再给点好建议?
没有的话就准备结帐了。
e_board 2011-10-09
  • 打赏
  • 举报
回复
我是这样处理的。定义个消息节点类,比如
class TMsgItem
{
public: char*msg;
int type;
}
让所有的线程产生的输出变成消息节点类。都存储到一个ObjectList里面。
在单独起一个线程或者定时器来对消息输出。然后从消息列表中删除。
缺点,实时性不好。
但是没有出现过异常
多个线程同时操作控件容易吊死。
__lhy 2011-10-09
  • 打赏
  • 举报
回复
自己加锁想必也可
luyun2011 2011-10-09
  • 打赏
  • 举报
回复
虽然我不是学C++的,但还是帮顶一下,呵呵
stbigcrab 2011-10-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bigfog 的回复:]
在线程的说明里不是有例子
// Important: Methods and properties of objects in VCL can only be
// used in a method called using Synchronize, for example:
//
// Synchronize(UpdateCaption);
//
// where UpdateCap……
[/Quote]

谢谢兄台,这个函数应该是只能在线程类里面使用吧?
我用CreateThread似乎不能使用。
sh_xjw 2011-10-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 1cctv 的回复:]

http://topic.csdn.net/u/20110213/16/2dc0ac4c-01c4-485d-ae1f-af8047e889f0.html
[/Quote]

学习
sh_xjw 2011-10-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bigfog 的回复:]

在线程的说明里不是有例子
// Important: Methods and properties of objects in VCL can only be
// used in a method called using Synchronize, for example:
//
// Synchronize(UpdateCaption);
//
// wh……
[/Quote]

这个才是正解!
xtayaitak 2011-10-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 1cctv 的回复:]
http://topic.csdn.net/u/20110213/16/2dc0ac4c-01c4-485d-ae1f-af8047e889f0.html
[/Quote]
我爱你:)
netying 2011-10-08
  • 打赏
  • 举报
回复
对memo的操作你可以封装在函数xxxxx中,然后用
Synchronize(xxxxx);执行
iqyely 2011-10-08
  • 打赏
  • 举报
回复
来关注下
1cctv 2011-10-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 stbigcrab 的回复:]
谢谢走天涯,已经对文章做了记号准备学习。
看了一遍,感觉似乎对VCL的安全解释不多,我提到的问题也没有得到正面的回答。
不过谢谢走天涯,你的文章是好文章,我会仔细学习下。
[/Quote]

在那样的框架下,没有安全问题.所以无需解释.

这个例子可以说是为你提的问题专门定制的啊.不过是提前了几个月,有点神奇.
stbigcrab 2011-10-08
  • 打赏
  • 举报
回复
谢谢走天涯,已经对文章做了记号准备学习。
看了一遍,感觉似乎对VCL的安全解释不多,我提到的问题也没有得到正面的回答。
不过谢谢走天涯,你的文章是好文章,我会仔细学习下。
bigfog 2011-10-08
  • 打赏
  • 举报
回复
在线程的说明里不是有例子
// Important: Methods and properties of objects in VCL can only be
// used in a method called using Synchronize, for example:
//
// Synchronize(UpdateCaption);
//
// where UpdateCaption could look like:
//
// void __fastcall aaa::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
wangcftxz 2011-10-08
  • 打赏
  • 举报
回复
帮楼主顶起 最近也在研究线程 有点郁闷
sh_xjw 2011-10-08
  • 打赏
  • 举报
回复
下面的话是网上找的


CreateThread创建的线程不可能掉用到Synchronize函数,Synchronize函数是TThread类的
一个保护性(protected)类别的函数,只能是其派生类(代码)中才能调用,所以,如果你
自己定义一个从TThread类继承下来的线程类,就可以使用Synchronize函数了。

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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