WideStudio/MWT Logo
WideStudio/MWT
Programming Guide
WideStudio/MWT Index
目次


スレッド



スレッドクラスを用いた長時間処理の実行

WSCvthread クラスを利用すると長時間かかる処理を実行することが できます。

長時間かかる処理を実行するには、メインスレッドとは別に動作する スレッドを、THREAD-STARTED トリガで起動するイベントプロシージャとして 記述します。

#include <WScom.h>
#include <WSCfunctionList.h>
#include <WSCbase.h>
//----------------------------------------------------------
//Function for the event procedure
//----------------------------------------------------------
//サブスレッドとして実行するイベントプロシージャ
void thread_ep(WSCbase* object){
  //長時間の処理
  //....
}

スレッドを実行するには、スレッドインスタンスに対して executeThread() メンバ関数を呼び出します。

  //THREAD-STARTED トリガで設定したイベントプロシージャを
  //サブスレッドとして実行
  newvthr_000->executeThread();

executeThread() メンバ関数によって起動された THREAD-START トリガで 設定したイベントプロシージャ内では、 メインスレッドとは非同期のサブスレッドとして動作するため、 スレッドアンセーフであるWideStudio の GUI インスタンスに対して 排他制御無しに操作してはいけません。 WideStudio の GUI インスタンスに対して スレッド内で処理を行なった結果を表示させたい場合等は、 スレッドインスタンスに対して sendActivateEvent() メンバ関数を 用いて、 メインスレッドに通知する手段を用います。 sendActivateEvent() メンバ関数を呼び出すと、 メインスレッドにおいて、ACTIVATE イベントが発生し、 そのイベントプロシージャ内で安全に、 WideStudio の GUI インスタンスに対して操作することができます。
下記は ACTIVATE トリガでスレッドインスタンスに設定した イベントプロシージャをメインスレッド上で起動する例です。

#include <WScom.h>
#include <WSCfunctionList.h>
#include <WSCbase.h>
//----------------------------------------------------------
//Function for the event procedure
//----------------------------------------------------------

void thread_ep(WSCbase* object){
  //長時間の処理
  //....

  //メインスレッドにACTIVATEイベントを通知
  object->sendActivateEvent();
}

メインスレッドで実行するための ACTIVATEトリガによるイベントプロシージャを 設定し、下記の例のようにサブスレッドと同期して、 WideStudio の GUI インスタンスを持ち用いた表示処理等を 行なうことができます。

#include <WScom.h>
#include <WSCfunctionList.h>
#include <WSCbase.h>
//----------------------------------------------------------
//Function for the event procedure
//----------------------------------------------------------
//メインスレッドで動作する
void activate_ep(WSCbase* object){
  //メインスレッドにACTIVATEイベントを通知
  newvlab_000->setProperty(WSNlabelString,"サブスレッドの処理が完了!");
}



スレッドからのWideStudioのGUIインスタンスへのアクセス

スレッドクラスにより生成した子スレッドから、 メインスレッドで実行される WideStudio の GUI インスタンスへのアクセスは、 メインスレッドをロックし、競合が発生しないようにすることで行ないます。

#include <WScom.h>
#include <WSCfunctionList.h>
#include <WSCbase.h>
//----------------------------------------------------------
//Function for the event procedure
//----------------------------------------------------------

void thread_ep(WSCbase* object){
  //子スレッドでの処理
  //....


  //競合が発生しないようメインスレッドを一時ロック。
  WSGIappDev()->lock();
    //メインスレッド上の WideStudio/MWT のインスタンスにアクセス
    newvlab_000->setProperty(WSNlabelString,"サブスレッドの処理が完了!");
  WSGIappDev()->unlock();

}


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


WideStudio/MWT documents index | 目次

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