« 2013年12月 | トップページ | 2014年8月 »

2014年3月

2014年3月20日 (木)

Delphiでスレッド

久しぶりにDelphi絡みのネタ

今回は2ち○んねるでスレッドの事が話題になってたので・・・サクっと記事を書いてみた。
Delphiでスレッドを扱う場合の基本はTThreadクラスを使う方法であるが、以前にTThreadクラスをすっとばして、

というネタを書いたが、今回は直接TThreadクラスを扱う場合についてちょっと書いてみるdashdash。といってもここで自分が言いたいことは前と同じで、要はGC(ガベージコレクタ)のない環境では、基本は通常の共有リソースへの排他制御などの他にスレッドの終了待ち合わせをしないとアクセスバイオレーションが発生するシナリオが多々あるのでどうにかしようということで・・・。

最近はDelphiでスレッドを扱う場合は、Delphiで非同期プログラミング で作った内部でスレッドプールを使う自前のライブラリを使ってたが、それ以前は、もちろんTThreadクラスを直接使ってこんな感じで使ってましたsweat01sweat01

まず、TThreadクラスを継承し、グループ化したTGroupedThreadクラスを用意して、別スレッドで実行する処理はこのTGroupedThreadクラスから派生させます。

で、後は、スレッドのグループを表すTThreadGroupクラスを用意します。スレッドの終了待ち合わせは個々のスレッドごとではなく、グループごとに行います。Shutdownメソッドでシャットダウンすると以降、新しいスレッドをグループに追加できなくなります。WaitForTerminationメソッドでグループ内のすべてのスレッドが終了する(厳密にはTGroupedThreadクラスのすべてインスタンスのデストラクタが呼ばれる)まで待ち合わせます。シャットダウンして、ペンディングのすべてのスレッドが終了したら、終了状態(IsTeminated = True)になる。

実際の実装は例えばこんな感じ。

こうしておけば、後は、実践的なアプリでは任意個のスレッドを任意のタイミングで起動したりするケースが多いと思いますが、それらの終了待ち合わせを簡単に扱えます。GUIをもつマルチスレッドアプリを色々作ってきたけど、とりあえず、もっと個別に色々制御したい場合もあると思うがこれで十分だったdash

ちなみに、2ち○んねるでFreeOnTerminate = Trueは使えないと言われてましたが、そんな事はない?と思います(なんか、設計・実装根本的にダメだったらどうしようdash)。

というより、このマルチスレッド・非同期での終了待ち合わせがうざいsweat01ので、マルチスレッドアプリ開発の観点から自分はさっさとデスクトップOS向けにもガベージコレクタを導入しろとずっと言い続けてます(ということで、スレッド三昧の自分は参照カウントされるDelphiのインターフェースばっか使ってるのである・・・)

« 2013年12月 | トップページ | 2014年8月 »

自作ソフトウェア

無料ブログはココログ

メモ