Rob*_*ank 4 delphi vcl synchronization thread-safety
我是线程的新手.我正在使用第三方库,它使用的线程有时会调用我提供的程序.
当线程调用时,如何从我的过程更新TLabel.Caption?
如果我在其他地方调用了InitializeCriticalSection,那就像它一样简单
EnterCriticalSection(CritSect);
GlobalVariable := 'New TLabel.Caption';
LeaveCriticalSection(CritSect);
Run Code Online (Sandbox Code Playgroud)
然后在我的主线程中:
EnterCriticalSection(CritSect);
Label1.Caption:= GlobalVariable;
LeaveCriticalSection(CritSect);
Run Code Online (Sandbox Code Playgroud)
但是,如何获取要调用的主线程代码?线程可以使用SendMessage吗?或者是否有一些更好/更简单的方法(.OnIdle可以检查线程设置的标志?)
谢谢.
Critical Sections用于序列化对一段代码的访问.要更新图形用户界面,您应该注意只有主线程才能更新GUI元素.
因此,如果您的线程需要更新GUI元素,它应该将其委托给主线程.为此,您可以使用不同的技术:
最简单的方法是在线程代码中使用Synchronize方法.调用Synchronize时,您的线程暂停,您提供给Synchronize的代码将在主线程的上下文中执行,然后您的线程将恢复.
如果你不喜欢每次调用那段代码时你的线程停止,那么你可以使用Queue方法.队列发送请求发往目的地的线程(在这里主线程)的消息队列,这样你的线程不会停止,但用户界面可能无法得到取决于主线程的消息队列如何拥挤立即更新.
另一种实现此目的的方法是使用SendMessage或PostMessage API函数将自定义Windows消息发送到主线程.在这种情况下,您必须定义自定义消息,并在需要更改UI元素时将其发送到主线程.您的主线程应该为该类型的消息提供消息处理程序,并处理收到的消息.结果与使用Queue方法类似.
要使代码在主线程中被调用,请查看TThread.Synchronize.它接受一个方法指针(或者,在D2009 +中,一个匿名方法)并处理幕后的所有消息,以确保您的代码将在主线程中运行.
归档时间: |
|
查看次数: |
5272 次 |
最近记录: |