WideStudio/MWT Logo
WideStudio/MWT
Programming Guide
WideStudio/MWT Index
Table of contents


使用Lock语句及Thread类和WorkingDialog来实现长时间处理运行



利用Thread类和WorkingDialog来实现长时间处理

利用WSCvthread 类和 WSCworkingDialog 的话,可以实现需长时间的处理。

在这里将通过简单的例子来说明Thread类和WorkingDialog的实装方法。在此例中,将制作一个按下按钮时,需花长时间的处理将在Sub Thread上进行,表示WorkingDialog的应用软件。

首先,制作一个窗口,配置按钮,然后在各自上配置WSCworkingDialog 和 WSCvthread 类的Instance,并把名称作为newwork_001,newvthr_002 。

在按钮处理中,如下例一样设定事件过程btnop(),将花费时间的处理在Sub Thread上运行,表示WorkingDialog。在程序中,标志dialog_vis_status 是通过WorkingDialog的 popup方法向处理中的Sub Thread通知表示已经结束的部分。 当WorkingDialog被解除时,popup()方法经复归,如果设定标志为False,可定义在Sub Thread中WorkingDialog为非表示状态。

#include <WScom.h>
#include <WSCfunctionList.h>
#include <WSCbase.h>
//----------------------------------------------------------
//Function for the event procedure
//----------------------------------------------------------
#include <newwin000.h>
//WorkingDialog是否表示的标志
WSCbool dialog_vis_status = False;

void btnop(WSCbase* object){
  //do something...
  dialog_vis_status = True;  //在生成Thread之前定义标志

  //生成Thread,开始实行处理。
  newvthr_002->executeThread();

  //设WorkingDialog为表示状态。
  newwork_001->popup();//(注意)到WorkingDialog为非表示状态为止,不会复归。
  dialog_vis_status = False;
}
static WSCfunctionRegister op("btnop",(void*)btnop);

其次,对WSCvthread 类的Instance newvthr_002,通过THREAD-STARTED 触发器设定作为Sub Thread运行的处理事件过程。 为了可随时解除WorkingDialog,记述作为Sub Thread运行的事件过程的重要在于,将长时间的处理分成许多很短的处理,然后运行逐步处理。 由于Instance为Thread un-safe,当在WorkingDialog上反映计数器值时,运行WSGIappDev()->lock(),由其来访问WorkingDialog。

#include <WScom.h>
#include <WSCfunctionList.h>
#include <WSCbase.h>
#include <unistd.h>
//----------------------------------------------------------
//Function for the event procedure
//----------------------------------------------------------
#include <newwin000.h>
extern long cnt;
extern WSCbool dialog_vis_status;
void thread_proc(WSCbase* object){
  cnt=0;
  while(1){
    //表示处理进展情形的计数。
    cnt++;

    //为了将计数器的值反映在WorkingDialog上
    //锁上Main Thread
    //访问Main Thread上的WorkingDialog。
    WSGIappDev()->lock();

    //在属性中设定表示进展情形的计数值。
    newwork_001->setProperty(WSNvalue,cnt);

    //如果计数值为 100 以上,Dialog变为非表示,
    //结束处理。
    if (cnt>100){
      newwork_001->setVisible(False);
    }

    //解除Main Thread的锁定
    WSGIappDev()->unlock();

    if (dialog_vis_status == False){
      //Dialog非表示,或被解除时结束处理。
      return;
    }
    if (cnt > 100){
      //如果运行了被分开的100回,就结束处理。
      return;
    }

    //在这里将长时间的处理分成很短的处理逐步运行。

#ifdef MSW
    Sleep(1000);
#else
    sleep(1);
#endif
  }
}
static WSCfunctionRegister op("thread_proc",(void*)thread_proc);



利用简易Thread类和WorkingDialog来实现长时间处理

以下是利用WSDthread 类和 WSCworkingDialog来运行长时间处理的例子。

首先准备一个窗口,配置按钮。然后配置WSCworkingDialog 类的Instance,名称作为 newwork_000。

在按钮处理中设定如下面一样的事件过程 btnop(),将花费时间的处理在Sub Thread上运行,并表示WorkingDialog。

下面是通过使用存在标志 canceled ,利用WSDthread::terminateThread()方法灵活地强制解除Sub Thread的方法。 由于使用WSDthread::terminateThread()方法来停止Sub Thread时,是在处理途中强制停止,故不适合文件资源操作处理。



强制结束Sub Thread的例子。

#include <WScom.h>
#include <WSCfunctionList.h>
#include <WSCbase.h>
#include <WSDthread.h>
#include <stdlib.h>
#include <unistd.h>
//----------------------------------------------------------
//Function for the event procedure
//----------------------------------------------------------
#include <newwin000.h>
WSDthread* thr = NULL;
WSCbool canceled = False;

//作为Sub Thread动作的过程

void* thread_func(WSDthread* obj,void*){
  //计数器
  long cnt= 0;
  while(1){
    //表示处理进展情形的计数器。
    cnt++;

    //为了将计数器值反映在WorkingDialog上,
    //锁定Main Thread
    //从Main Thread上访问WorkingDialog。
    WSGIappDev()->lock();

    //在属性中设定表示进展情形的计数器值。
    newwork_001->setProperty(WSNvalue,cnt);

    //如果计数器价值为 100 以上,变Dialog为非表示
    //结束处理。
    if (cnt>100){
      newwork_001->setVisible(False);
    }

    //解除Main Thread的锁定。
    WSGIappDev()->unlock();
    //在这里竟将长时间处理分成很短的处理,进行逐步处理。
#ifdef MSW
    Sleep(1000);
#else
    sleep(1);
#endif

    //如果计数器为100,结束处理。
    if (cnt == 100){
      return NULL;
    }
  }
  return NULL;
}

//当按下按钮,表示WorkingDialog,开始处理。

void btnop(WSCbase* object){
  if (thr == NULL){
    //生成Thread Instance。
    thr = WSDthread::getNewInstance();
    //设定作为Sub Thread运行的过程
    thr->setFunction(thread_func);
    //生成Sub Thread
    thr->createThread(NULL);
    //表示WorkingDialog
    long val = newwork_000->popup();
    if (val == WS_DIALOG_OK){
    }else{
      //强制结束Sub Thread。
      thr->terminateThread();
    }
  }else{
    exit(0);
  }
}
static WSCfunctionRegister op("btnop",(void*)btnop);

参照标志安全结束Sub Thread的例子。

#include <WScom.h>
#include <WSCfunctionList.h>
#include <WSCbase.h>
#include <WSDthread.h>
#include <stdlib.h>
#include <unistd.h>
//----------------------------------------------------------
//Function for the event procedure
//----------------------------------------------------------
#include <newwin000.h>
WSDthread* thr = NULL;
WSCbool canceled = False;

//作为Sub Thread动作的过程
void* thread_func(WSDthread* obj,void*){
  //计数器
  long cnt= 0;
  while(1){
    //表示处理的进展情形的计数器。
    cnt++;
    //为了将计数器的值反映在WorkingDialog上,
    //锁定Main Thread
    //从Main Thread上来访问WorkingDialog。
    WSGIappDev()->lock();

    //在属性中设定表示进展情形的计数器值。
    newwork_001->setProperty(WSNvalue,cnt);

    //如果计数器值为 100 以上,变Dialog为非表示,
    //结束处理。
    if (cnt>100){
      newwork_001->setVisible(False);
    }
    //解除Main Thread的锁定。
    WSGIappDev()->unlock();

    //在这里将长时间处理分成很短的处理,逐步处理。
#ifdef MSW
    Sleep(1000);
#else
    sleep(1);
#endif

    //如果计数器成为了100,结束处理。
    if (cnt == 100){
      return NULL;
    }
    //参照标志,判断是否应该中断处理。
    if (canceled != False){
      return NULL;
    }
  }
  return NULL;
}
//当按下按钮,表示WorkingDialog,开始处理。
void btnop(WSCbase* object){
  if (thr == NULL){
    //生成Thread Instance。
    thr = WSDthread::getNewInstance();
    //作为Sub Thread设定运行过程
    thr->setFunction(thread_func);
    //生成Sub Thread
    thr->createThread(NULL);
    //表示WorkingDialog
    long val = newwork_000->popup();
    if (val == WS_DIALOG_OK){

    }else{
      //中止Sub Thread处理。
      canceled = True;
    }
  }else{
    exit(0);
  }
}
static WSCfunctionRegister op("btnop",(void*)btnop);


Document Release 3.90 for WideStudio/MWT ver 3.90, Jul 2005


WideStudio/MWT documents index | Table of contents

Copyright(C) WideStudio/MWT Development Team, 1999-2005 Last modified: Jul 31, 2005