多线程我没什么问题。我使用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 :(得分:0)
但这里有一个问题。当VCL表单终止我的线程可以检查某些表单(类)参数
不要这样做,因为你找到了正确的理由。不要直接从辅助工作线程访问任何表单实例变量。
如果您必须与GUI线程VCL组件或TForm后代实例变量进行通信,请仅通过Windows消息进行通信,最好是PostMessaged到表单。
解决此问题的唯一方法是确保在释放表单实例之前终止辅助线程。这将导致你进入一个曲折的小僵局的迷宫,所有类似的:(