![]() | 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(); }
Copyright(C) WideStudio/MWT Development Team, 1999-2005 | Last modified: Jul 31, 2005 |