因为大部分VCL都不是线程安全的,不支持多线程,所以当你使用了TThread对象的时候,最好把界面更新的部分放到一个方法中,然后在线程的Execute方法中调用Synchronize(Your GUI Method);这样才能做到VCL同步
解决方案 »
- 能否通过一个循环语句来实现对名称赋值
- 怎么解决字符串中有“&”符号的问题
- 键盘钩子的问题,好久了,还没有能解决,请各位大侠出手
- 编写asp组件时,用try..except结构的问题
- Delphi语法中的with...do是什么意思?等同于C++或者Java的什么语法?
- 记录指针!问题!菜鸟提问!
- 关于异常处理的疑惑,麻烦高手指点指点!
- 我写一个COM组件在自动类中用到了这个:varArraycreate([0,FContentLength],varByte);编译过程中提示:Undeclared identifer:'vararraycreate'请问是否需要在USES中包含特别的单元?
- 存储过程,给个例子
- 我用ADO连接Access数据库,设置数据库密码为“123”后却无法连接数据库,有人能解决吗?
- 在整数转换到指定长度的字符的时候,如何将不齐长度的前面加0?
- 紧急求助
CreateEvent, ResetEvent, SetEvent
通过WaitFor函数来等待这个Event触发,一个线程CreateEvent,有数据后SetEvent,
另一个线程WaitFor这个Event,当SetEvent后,取得这个线程的数据,然后ResetEvent
或用PostThreadMessage,然后在另个线程中建立一个消息队列,PeekMessage/GetMessage
数据可以通过Thread里面的域的数据,也可以通过PostThreadMessage将数据的指针传给另一个线程
而在线程中,用WaitForSingleObject
如果虽然是一个处理线程,不同的数据来源处理不同,那还是用四个Event更清晰简便一些。
WaitFor不是有个WaitForMultpleObjects等待多个Handle,
//等待4个
var
Event: array [0..3] of THandle;Event[0] := CreateEvent(...); //线路1
....case WaitForMultipleObjects(4, @Event[0], , False, INIFITINE, QS_ALLINPUT) of
WAIT_OBJECT_0: ;//第一个线路的Event触发
WAIT_OBJECT_0 + 1: ;//第二个线路的Event触发
WAIT_OBJECT_0 + 2: ;//第三个线路的Event触发
WAIT_OBJECT_0 + 3: ;//第四个线路的Event触发
else
ErrorProc;//
end;
如果不想用Event,嫌它多的话,可以用:
Semaphore
CreateSemaphore, ReleaseSemaphore, 和WaitFor的组合
它是像计数器一样,限定资源的数量,通过WaitFor, ReleaseSemaphore来得到和Release资源计数器
在每次查询后sleep一下。也许就好了。
在每次查询后sleep一下。也许就好了。
WaitFor在Windows我也总觉得有延迟。:(