从线程访问

时间:2013-05-02 14:57:23

标签: multithreading thread-safety vcl

多线程我没什么问题。我使用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

1 个答案:

答案 0 :(得分:0)

  

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

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

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

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