« Delphiで非同期プログラミング | トップページ | Windows 8 API List »

2012年4月 8日 (日)

Delphiで非同期プログラミング・・・おまけ

前回 簡単な固定スレッド数のスレッドプールを実装してみたが、自分で実装する事はバグの温床になりかねないわけで、最初はWindows Vistaで追加された新しいスレッドプールAPIを利用して実装しようとして、断念してましたが、せっかくなので。

まず、Vistaで追加された新しいスレッドプールAPIについては、

を参考に。

新しいスレッドプールAPIはプロセスに複数のスレッドプールを作成できたり、ペンディングの操作をキャンセルできたり、何より天下のマイクロソフト様が実装してるので、使わない手はないのですが、ちょっと、問題が・・・

Delphiでは、サブスレッドとGUIスレッドであるメインスレッドを簡単に同期するための仕組みとしてTThread.Synchronizeメソッドがあるわけですが、メインスレッド側で待機操作をする場合、定期的にClasses.pasのCheckSynchronize手続きを呼ばないと、サブスレッド側でTThread.Synchronizeされてた時に、デッドロックが発生しますが、Vistaで新しく追加されたスレッドプールAPIの、例えば、ワークコールバックが完了するまで待機するWaitForThreadpoolWorkCallbacks APIを見ると・・・

タイムアウトを指定できません。要するに定期的にCheckSynchronize手続きを呼べないわけで、あぼーんdashdash

TThread.SynchorizeはDelphi独自のメカニズムで同じような事を直接WinAPIのSendMessageでやっても、デッドロック(これからは、TThread.Queue(PostMessage)の時代?)。

単純に1対1にマッピングはできなくてある程度自分で作り込む必要あるっぽいねweep

まぁ、とりあえず、Vistaで追加された新しいスレッドプールAPIのヘッダだけでも


« Delphiで非同期プログラミング | トップページ | Windows 8 API List »

Delphi」カテゴリの記事

Windows」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1497665/44745836

この記事へのトラックバック一覧です: Delphiで非同期プログラミング・・・おまけ:

« Delphiで非同期プログラミング | トップページ | Windows 8 API List »

自作ソフトウェア

無料ブログはココログ

メモ