【问题标题】:Accessing to from from thread从线程访问
【发布时间】:2013-05-02 14:57:22
【问题描述】:

我对多线程没什么问题。我使用 CreateThread 创建自己的线程并在程序启动时创建它(抱歉,目前我不能使用 VCL 线程)。所以我的线程使用我的 VCL 表单。所有程序生命的第二线程生命也是如此。但这里有一个问题。当 VCL 表单要终止我的线程时,可以检查一些表单(类)参数。当然,当我的主表单已经终止并且某些线程尝试检查此表单中的方法时......然后我遇到了访问冲突。

如何保护 VCL 表单中的检查参数?谢谢!

这是我的代码。

unsigned int WINAPI CheckMutex( LPVOID lpParam )
{
    const int def = 20;
    int Cnt = def;
    UnicodeString text;
    while (1)
    {
        if (!UpdFrm || !UpdFrm->Label8 || UpdFrm->MutexTerminate)
            break;

首先我检查指向 UpdFrm 的指针,但 VCL 表单可以终止,但指向表单的指针仍然存在。所以这就是为什么我检查一些现有的控件。只有在那之后我才检查 MutexTerminate

【问题讨论】:

  • 在Form的析构函数中,可以将UdpFrm变量设置为NULL。但这并不能消除 UdpFrm 在您第一次检查它时可能为非 NULL,然后在您可以访问其成员之前变为 NULL 的竞争条件。为什么不在 Form 被释放之前终止线程呢?

标签: multithreading thread-safety vcl


【解决方案1】:

但是这里有一个问题。当 VCL 表单要终止时,我的线程可以检查一些表单(类)参数

不要这样做,这正是你找到的原因。不要从辅助工作线程直接访问任何表单实例变量。

如果您必须与 GUI 线程 VCL 组件或 TForm 后代实例变量进行通信,则只能通过 Windows 消息进行,最好是 PostMessaged 到表单。

解决此问题的唯一其他方法是确保在释放表单实例之前终止辅助线程。这将带你进入一个曲折的小僵局迷宫,都一样:(

【讨论】:

  • 谢谢,但你能解释一下吗?所以我有名为“UpdFrm”的表格。在构造函数中,我通过“CreateThread”创建新线程。所以我必须通过 PostMessage 向我的所有者线程发送消息?如果我只想检查可验证的,我必须做什么?当然,我可以将我的线程移动到 TThread 类并使用“同步”方法,但这解决了我的问题吗?你能给我一些例子或书,我可以读到这个吗?谢谢指教!!
  • 如果你在窗体的构造函数中创建线程,那么逻辑上你可以在窗体的析构函数中终止线程。这样,Form 指针在线程运行时永远不会无效。
  • 仅供参考,您无需将线程切换到TThread 即可使用Synchronize()TThread 具有 Synchronize() 的静态版本,不需要 TThread 对象实例。
猜你喜欢
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 2012-06-26
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
相关资源
最近更新 更多