delphi - 线程同步问题的困惑

标签 delphi multithreading synchronize

今天读到 Zarko Gajic 的文章时,我感到很困惑:

多线程 Delphi 数据库查询

文章网址:http://delphi.about.com/od/kbthread/a/query_threading.htm

源代码:http://delphi.about.com/library/weekly/code/adothreading.zip

有了“TCalcThread.Execute”程序的代码,为什么下面的代码不需要放在Synchronize()方法中运行?

Line 173:    ListBox.Clear;  
Line 179:    ListBox.Items.Insert(......);
Line 188:    ListBox.Items.Add('*---------*');
Line 195:    TicksLabel.Caption := 'Ticks: ' + IntToStr(ticks);

这些代码操作VCL组件,与UI更新相关。据我所知,这些操作应该使用线程同步,并由主线程执行。难道是我的知识有缺陷?

最佳答案

这是一种罕见的情况,您可以从 Windows 为您执行线程同步这一事实中受益。原因是对于列表框,项目是使用带有控制特定消息的 SendMessage 来操作的。因此,每个 SendMessage 调用都会确保消息由创建控件的同一线程(尤其是主线程)处理。

就像我说的,这是一个罕见的案例。它还会导致这三个调用中的每一个调用都发生线程切换,这会降低性能。您最好还是使用 Synchronize 强制该代码块在其所属的主线程中运行。它还确保,如果您开始使用内部不使用 SendMessage 的控件,您不会被咬住。

关于delphi - 线程同步问题的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2090533/

相关文章:

delphi - 如何指示鼠标滚轮输入控制光标下而不是聚焦?

delphi - 数据快照 : Is there a way to detect connection loss globally?

c - pthread_create 后跟 pthread_detach 仍然会导致 Valgrind 中可能丢失错误

c# - 通过并行运行 foreach 循环以构建结果列表

c++ - 使用BOOST线程属性导致bind编译错误

java - 在两台服务器之间同步缓存数据的最佳方式

delphi - Base64_to_stream Turbo power Lockbox 3.6.2 Delphi Xe7 | Base64_to_stream Turbo power Lockbox 3.6.2 Delphi Xe7 E2010 不兼容类型 : 'System.TArray<System.Byte>' and 'string'

delphi - 如何在 "uses"子句中创建子库?

android - 如何将 Android-Project 添加到 GitHub

Java等待和notifyAll : IllegalMonitorStateException