Software
全部博文(16)
分类: C/C++
2007-06-28 15:43:46
没想到wxWidgets并不是很难学。wxDev也不是很难用。希望可以很快就能够把我所有VC++的源码都转换成wxWidgets。
wxDev虽然没有VC++那样的棒,不过还能够接受。只要熟悉了就不难运用了。只是编译的速度有点慢。
至于这个多线程,也是使用wxThread编成的。
class CThread : public wxThread
{
public:
CThread(void (*pfnThread)(void),void (*pfnThreadInitial)(void)=NULL,void (*pfnThreadEnd)(void)=NULL)
{
this->pfnThread=pfnThread;
this->pfnThreadInitial=pfnThreadInitial;
this->pfnThreadEnd=pfnThreadEnd;
}
virtual ExitCode Entry() //Entry是线程的进入口
{
if (pfnThreadInitial)
pfnThreadInitial();
if (pfnThread)
pfnThread();
if (pfnThreadEnd)
pfnThreadEnd();
return 0;
}
void ForceTermination() //not encourage to force termination,
{ //beacuse may be lead to resource not release by OS
Kill();
}
public:
//用户定义的函数
void (*pfnThread)(void); //主函数
void (*pfnThreadInitial)(void); //初始化函数
void (*pfnThreadEnd)(void); //终止前函数
};
/*
TObj created to manupulate the CThread/wxThread indirectly,
because wxThread prohibit the copy constructor (wxThread(wxThread &)) and = operator.
由于wxThread不允许应用copy constructor,所以就创建一个物件TObj来应用CThread/wxThread的。
*/
class TObj
{
public:
TObj(TObj *obj) //copy constructor
{
pThread=obj->pThread;
}
TObj(void (*pfnThread)(void),void (*pfnThreadInitial)(void)=NULL,void (*pfnThreadEnd)(void)=NULL)
{
StartInitialSetup(pfnThread,pfnThreadInitial,pfnThreadEnd);
}
void StartInitialSetup(void (*pfnThread)(void),void (*pfnThreadInitial)(void)=NULL,void (*pfnThreadEnd)(void)=NULL)
{
pThread=new CThread(pfnThread,pfnThreadInitial,pfnThreadEnd);
}
void Reset()
{
pThread->ForceTermination();
Initialization();
StartInitialSetup(pThread->pfnThread,pThread->pfnThreadInitial,pThread->pfnThreadEnd);
Start();
}
void Start()
{
pThread->Create();
pThread->Run();
}
void Pause()
{
pThread->Pause();
}
void Resume()
{
pThread->Resume();
}
~TObj()
{
if (pThread->IsAlive())
{
pThread->Wait();
}
}
void Initialization()
{
if (pThread->pfnThreadInitial)
pThread->pfnThreadInitial();
}
private:
CThread *pThread;
};
应用法:
在文件的顶端定义线程列表以及工作函数,
void Task1Init(void); //初始化函数
void Task2Init(void);
void Task3Init(void);
void Task4Init(void);
void Task1(void); //主工作函数
void Task2(void);
void Task3(void);
void Task4(void);
//Task's Table
TObj Task[]={
TObj(Task1,Task1Init),
TObj(Task2,Task2Init),
TObj(Task3,Task3Init),
TObj(Task4,Task4Init)
};
int TObjSize=sizeof(Task)/sizeof(TObj); //Size of the TObj
//初始化函数是用于初始化各别线程自己使用的变量或设定
void Task1Init(void)
{
cnt1=0;
}
//Task1-Task4只是把计算器无止境的加一,然后显实在WxEdit控件里。
void Task1(void)
{
wxString str;
for(;;)
{
str.Printf("%d",cnt1++);
pThreadDlg->WxEdit1->Clear();
pThreadDlg->WxEdit1->WriteText(str);
Sleep(50);
}
}
在程式的进入处触发/启动所有的线程,
for(int cnt=0;cnt
这个软件允许用户启动,暂停,还原运行以及终止线程。
pfnThreadInitial - 是每一次重启后初始化函数。
pfnThread - 是主要的工作函数。
pfnThreadEnd - 线程终止前调用的函数(用于释放资源)。
这个只是个开始,将来我还需要完善化这个多线程的物件/函数库。
还要加入CRT线程,以及一个线程总管...
执行软件:
http://blogimg.chinaunix.net/blog/upfile/070628172123.zip
源码:
http://blogimg.chinaunix.net/blog/upfile/070628172154.zip
wxDex: