请讨论一下控件的多线程安全性问题(50分)

  • 主题发起人 budianermayi
  • 开始时间
B

budianermayi

Unregistered / Unconfirmed
GUEST, unregistred user!
我知道所谓的控件是非线程安全是指的什么,不安全的控件在多线程中运行时会有什么
危险???是不是在多个线程同时操作一个控件时候才会出现危险??
 
我也想知道
 
哪位高手帮我讲讲啊???
 
1 任何对Windows GDI的调用必须受到保护
2 任何映射到GDI的VCL的方法或属性都不是线程安全的. 一般的, 任何可视化的东西
都不是线程安全的. 但幕后的工作通常是安全的. 如果不能确定, 假定不安全.
3 读取长字符串和动态数组是安全的, 但是写不是.
4 分配和释放内存是安全的. 但是一定要用Delphi的begin
Thread代替API的CreateThread
5 仅当构造函数和析构函数是安全的, 生成或释放对象才是安全的.
 
当然有危险,如一个共享队列,两个线程同时来取一个数据,结果肯定会错误,就好象两个人
同时拿到了一张机票,到底算谁的?
解决办法:1。先InitializeCriticalSection 初始化一个临界量
然后利用下面的两个函数来锁定代码执行。
SelectCriticalSection(临界量)
需锁定的代码,如取队列数据
leaveCriticalSection(临界量)
2。CreateMutex
3.还有delphi的多线程专门调用关于vcl组件的一个函数syncro……,呵呵,具体
什么我也忘了,自己查吧,很容易查到的。
 
将与VCL及公共变量相关的过程,在Execute中用Synchronize 来调用。
 
与控件或者主窗体通信的,在Execute中用Synchronize 方法来调用。
 
好题目.
 
如果不存在多个线程的共同作用,也就是说,同一时刻只能有一个线程操作界面控件,会
出现所谓的危险嘛?
 
在Execute中用Synchronize 方法来调用。这不是明摆着是单线程嘛,我试验了很多次
delhpi 的多线程问题多多,到处地雷,我现在这样用

Execute中调用外部可执行程序
ShellExec ....
Wait ...
但是注意如果你使用BDE,那么最好别这样用,因为BDE是的彻底的垃圾,起3个程序保证系统资源不足
不管你是64M 还是 128M 还是 256 还是 512M 都一个德行

 
顶部