【发布时间】: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