2013-05-02 77 views
0

我有多线程的小问题。我使用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

+0

在窗体的析构函数中,你可以设置'UdpFrm'变量为NULL。但是这并不能消除'UdpFrm'可能是非-NULL当你第一次检查它,然后在你可以访问它的成员之前变为NULL。为什么不在表单被释放之前终止线程? – 2013-05-04 00:24:42

回答

0

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

不要这样做,因为你已经找到了。不要直接从辅助工作线程访问任何形式的实例变量。

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

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

+0

谢谢,但你能解释一点点吗?所以我有一个叫做“UpdFrm”的表单。在构造函数中,我通过“CreateThread”创建了新的线程,所以我必须通过PostMessage向我的所有者线程发送消息?而且,如果我只想检查可见性,我必须做些什么?当然,我可以将线程移动到TThread类并使用“Synchronize”方法,但这一个解决我的问题?你能给我一些例子或书籍在哪里我可以读这个?谢谢你的建议!! – user922871 2013-05-02 19:50:59

+0

如果你在窗体的构造函数中创建线程,那么逻辑上你可以终止窗体的析构函数中的线程。这样,在线程运行时,Form指针永远不会失效。 – 2013-05-04 00:21:41

+0

仅供参考,您不需要将您的线程切换到'TThread'以使用'Synchronize()'。 'TThread'具有'Synchronize()'的静态版本,不需要'TThread'对象实例。 – 2013-05-04 00:23:03