我是线程新手。我正在使用一个第三方库,该库使用线程,有时会调用我提供的过程。
当线程调用我的过程时,如何更新 TLabel.Caption?
如果我在其他地方调用了InitializeCriticalSection,它是否像
EnterCriticalSection(CritSect);
GlobalVariable := 'New TLabel.Caption';
LeaveCriticalSection(CritSect);
然后在我的主线程中:
EnterCriticalSection(CritSect);
Label1.Caption:= GlobalVariable;
LeaveCriticalSection(CritSect);
但是,如何让主线程代码被调用呢?线程可以使用SendMessage吗?或者是否有一些更好/更简单的方法(.OnIdle 可以检查线程设置的标志?)
Thanks.
关键部分用于序列化对一段代码的访问。对于更新图形用户界面,您应该注意只有主线程才应该更新 GUI 元素。
因此,如果您的线程需要更新 GUI 元素,它应该将其委托给主线程。为此,您可以使用不同的技术:
最简单的一种是在线程代码中使用 Synchronize 方法。当调用 Synchronize 时,您的线程将暂停,您提供给 Synchronize 的代码将在主线程的上下文中执行,然后您的线程恢复。
如果您不希望每次调用该代码段时线程都停止,那么您可以使用 Queue 方法。 Queue 将您的请求发送到目标线程(这里是主线程)的消息队列,因此您的线程不会停止,但 UI 可能不会立即更新,具体取决于主线程消息队列的拥挤程度。
实现此目的的另一种方法是使用 SendMessage 或 PostMessage API 函数将自定义 Windows 消息发送到主线程。在这种情况下,您必须定义一条自定义消息,并在需要更改 UI 元素时将其发送到主线程。您的主线程应该为该类型的消息提供一个消息处理程序,并处理收到的消息。结果与使用 Queue 方法类似。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)