解决方案 »
- 敢问路在何方?
- 小女子弱弱的问:哪里可以下载TApdComPort控件,而且适用于delphi7.0
- 在Delphi中如何调用Advapi32.dll和Crypt32.dll中的CSP加密模块???
- 我有很多的公共function,怎样把它们写在一个pas文件中,以便以后方便调用?
- 程序见面问题:我的程序现在做见面由于Form很多,都采用bsNone形式,为了更好的见面每个Form上有10个以上的Image图片,在这中情况下如何
- 如何通过ADO远程连接到一个服务器上?在线等待!!!!
- 如何在程序中实现播放wav的声音文件啊,给个例子吧
- 一个简单的SQL语句问题,请帮帮我
- Delphi 5.0 导入 ActiveX 组件(MSComm32.ocx)疑难。在线等。
- 能不能用zlib来压缩avi文件,最好给个示例的说
- 这个函数DELPHI如何定义?
- Delphi 调用.net WebService方法360提示上传隐私??
VCL线程同步是因为线程B手太长,用了线程A的里的对象。你贴的例子里只是传递一个int而已,所以没有线程安全问题。
线程安全,通常的概念是指对某一数据(对象、指针、某数据类型)进行读写保护,以保护各线程的读写的正确性。主线程同步作用:
在访问VCL组件,如UI之类(窗体,界面相关的感知组件)及上述所说的某一数据。
在进行该类Read/Write访问时,不会与主线程相关冲突,引起主线程界面假死、卡死。
所以,一般进行UI同步时,一般作法是:post/send message
如:
Post/SendMessage(ParentHandle, WM_XXX, X, Y);
然后由有窗体的类中进行处理WM_XXX的消息
注意点:
Post注意返回值,是否post成功
Send注意超时,也就是说在窗体消息处理尽可能高效这是次线程(工作线程)==>主线程
反过来的同步操作是:主线程通知次线程的同步
一般作法:
1:PostThreadMessage(ThreadId, WM_XXX, X, Y)
工作线程创建线程消息队列,不停的取消息,具体使用可查看: GetMessage, PeekMessage函数,或点进Application.Run看看它里面的函数看看。
2:其它信号量,如Event, Semaphore
Event/Semaphore + WaitFor函数
while not terminated do
[
if WaitFor(event, timeout) = signal then
[ do my code ];
]
3:队列轮询
写个队列吧,不停的检索队列是否有数据,这机制类似消息队列
while not terminated do
[
if pop(queue, entry) then
[
do my code with entry
]
else
sleep(x);
]
4:标志位触发
不停的检查标志位。好像废话多了。
多线程是个蛋疼的活计,原因就在于同步,特别你需要N线程竞争一个锁之后,要用好不容易,努力吧。
两个线程虽没有共享对象, 但却用了ShowMessage, 这个是要主线程同步的.
两个线程虽没有共享对象, 但却用了ShowMessage, 这个是要主线程同步的.我只想说,你贴的代码没有体现线程同步的问题。 showmessage是在主线程中运行的。打印线程ID看看就知道了。
SendMessage要等消息返回子线程才能去做其他的事研究一下用synchrsize同步的方法吧,不同步出了问题不好调,浪费时间
两个线程虽没有共享对象, 但却用了ShowMessage, 这个是要主线程同步的.我只想说,你贴的代码没有体现线程同步的问题。 showmessage是在主线程中运行的。打印线程ID看看就知道了。
比较一下下面2种写法:
写法1:
------------------------------------------------------------------------
主线程:
TMainThread.CMXXX(var Message: TMessage);message XXX;
begin
showmessage(IntToStr(Message.LParam));
end;子线程:
procedure TSubThread.Execute;
begin
PostMessage(FMainThread.handle, XXX, 0, 123);
end;
------------------------------------------------------------------------写法2:
---------------------------------------------------------------------
主线程:
TMainThread.XXX(param: integer);
begin
showmessage(IntToStr(Param));
end;子线程:
procedure TSubThread.Execute;
begin
FMainThread.XXX(123);
end;