Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103522
  • 博文数量: 16
  • 博客积分: 1435
  • 博客等级: 上尉
  • 技术积分: 170
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-15 18:51
个人简介

Software

文章分类

全部博文(16)

文章存档

2012年(1)

2011年(1)

2010年(2)

2009年(1)

2008年(6)

2007年(5)

我的朋友

分类: 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 Task[cnt].Start();

这个软件允许用户启动,暂停,还原运行以及终止线程。

pfnThreadInitial - 是每一次重启后初始化函数。
pfnThread - 是主要的工作函数。
pfnThreadEnd - 线程终止前调用的函数(用于释放资源)。


这个只是个开始,将来我还需要完善化这个多线程的物件/函数库。
还要加入CRT线程,以及一个线程总管...

 

执行软件:
http://blogimg.chinaunix.net/blog/upfile/070628172123.zip
源码: 
http://blogimg.chinaunix.net/blog/upfile/070628172154.zip
wxDex:

阅读(4513) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-01-01 08:29:24

学习!