#pragma once
#include "jwThread.h"
using namespace orsci;
class TMyThread : public TThread
{
public:
TMyThread(const string & AVarName, const bool ACreateSuspended = true) : TThread(ACreateSuspended) {FVarName = AVarName;}
string FVarName;
public:
virtual unsigned long Execute() //!!注意!!:在Execute()函数内不要定义需要释放的对象变量,因为如果线程是被终止的,那么该对象无法被释放。一种替代方法是将其作为类的成员变量。那么类释放的时候,对象就会释放。
{
cout << idThread << "In MyThread" << endl;
if (is_FreeOnTerminated())
{
MessageBoxA(0, (FVarName + ":**自动释放对象**").c_str(), jw::IntToStr(idThread).c_str(), MB_OK);
}
else
{
MessageBoxA(0, (FVarName + ":**不是**自动释放对象").c_str(), jw::IntToStr(idThread).c_str(), MB_OK);
}
cout << "Now, " << FVarName << " : Execute()执行完毕" << endl;
return 0;
}
};
inline void Test_Thread()
{ //本函数演示,线程的执行!
cout << "E007:演示多线程执行...http://www.orsci.cn" << endl;
TMyThread a("aa", false), b("bb", false), c("cc", false);
a.Resume();
b.Resume();
c.Resume();
//注意:此处为了演示,必须在主线程等待,否则因主线程结束看不到子线程效果。当然,可以使用pause暂停一段时间!
cout << "good bye" << endl;
cout << "Any Key Exit ..." << endl;
char xpp;
cin >> xpp;
}
inline void Test_FreeOnTerminated()
{ //本函数演示线程的自动释放。在指针对象中特别有用。
//但是:自动释放的对象,要求在派生类中的析构函数中,不能执行任务东西。
//若确实需要在自定义的线程对象释放前,执行一些析构过程,请在继承OnFinished事件或者OnAfterExecute事件,然后在事件处理中完成释放工作。
cout << "E007:演示多线程执行(自动释放对象编程)...http://www.orsci.cn" << endl;
TMyThread a("a"), b("b"), c("c");
TMyThread * x, * y, * z;
x = new TMyThread("x", true); //首先挂起
y = new TMyThread("y", true);
//z =
x->SetFreeOnTerminated(true); //设置对象自动释放。
x->Resume(); //然后继续
y->SetFreeOnTerminated(true);
y->Resume();
a.Resume();
//注意:此处为了演示,必须在主线程等待,否则因主线程结束看不到子线程效果。当然,可以使用pause暂停一段时间!
cout << "good bye" << endl;
cout << "Any Key Exit ..." << endl;
char xpp;
cin >> xpp;
cout << a.getGlobalThreadCount() << endl;
cin >> xpp;
} |