与TThread
后代一起工作时,我基本上有一个选择:
- 设置
FreeOnTerminate
为true
删除我的TThread
后代对象但不将其设置为NULL
- 手动完成并自己完成删除它的所有麻烦
我基本上需要的是一种确定线程是否正在运行的方法,所以我做了以下事情:
//------------------------------------------------------------------------------
// Thread descendant
//------------------------------------------------------------------------------
class TMyThread : public TThread
{
private: UnicodeString StatusLine; // Used for Synchronize function
void __fastcall UpdateGUI();
protected: virtual void __fastcall Execute();
public: __fastcall TMyThread();
};
//------------------------------------------------------------------------------
TMyThread *MyThread;
//------------------------------------------------------------------------------
// Thread constructor
__fastcall TMyThread::TMyThread() : TThread(true)
{
FreeOnTerminate = false;
Priority = tpNormal;
}
// Synchronize function for Form1
void __fastcall TMyThread::UpdateGUI()
{
Form1->Label1 = StatusLine;
}
// Execute code
void __fastcall TMyThread::Execute()
{
Sleep(2000);
StatusLine = "I am almost done!";
Synchronize(&UpdateGUI);
}
// Thread terminate, delete object, set to NULL
void __fastcall TForm1::ThreadTerminateIfDone(TMyThread *T)
{
if (T != NULL && WaitForSingleObject(reinterpret_cast<void*>(T->Handle),0) == WAIT_OBJECT_0)
{
T->Terminate();
T->WaitFor();
delete T;
T = NULL;
}
}
// And initialization part which needs to check if thread is already running
void __fastcall TForm1::StartOrRestartThread(TObject *Sender)
{
// Remove old thread if done
ThreadTerminateIfDone(MyThread);
// Check if thread is running - NULL = not running and terminated or uninitialized
if (MyThread == NULL)
{
MyThread = new TMyThread();
MyThread->Start();
}
else
{
Application->MessageBox(L"Thread is still running please wait!", L"Error", MB_OK);
}
}
此代码按原样工作。我的问题是:
有没有办法简化这个?完成后我需要设置
MyThread
为 NULL,以便在下次调用启动/重新启动之前该对象不存在?这不能通过FreeOnTerminate
设置为 true 来完成,因为它会删除对象。我只能尝试访问然后生成异常的对象(我可以捕获但它是愚蠢的)。在初始化或重新启动之前,我真的只需要知道 MyThread 是否已完成执行。我可以在不终止线程的情况下重新启动线程吗(在程序完成之前我真的不需要删除对象) - 如果我启动线程,我会得到“无法在正在运行或挂起的线程上调用启动”异常。