こんにちは、梅澤@プロキャストです。
「Synchronize()をすれば、QData に対してEnqueueするのもDequeueする
のも メインスレッドとなるので、QDataの読み書きの排他制御は不要で
はないか?」というのが質問の意図だと思うのですが、いかがでしょう
か?
確かに、この仕組みならQDataの読み書きの排他制御は不要だと思います。
ただ、個人的には、
メインスレッド側でどんな重い処理をするのか分からず、
サブスレッドの処理(Indyの受信後の処理)が滞る可能性(メインスレッド
が重いため、Synchronizeの処理がなかなか出来ずに時間がかかる可能性)が
気になります。
メインスレッド側が重い処理にならない絶対の自信が無いなら、自分は以下
のようにすると思います。
・メインスレッドがサブスレッド作成時に、メインウィンドウのHandle
をサブスレッドに渡しておく。
・サブスレッドで、QData.Enqueue()する。
(CriticalSectionを使って、保護)
・サブスレッドからメインスレッドにでデータを入れた事を通知。
通知には、PostMessage()を使う。
Handleは先に渡されていたもの。
(これをせずに、単純にApplication.MainFormHandleでも良いとは思い
ますが...)
・メインスレッドは、PostMessage()されたメッセージを受信したら、
QData.Dequeue() する。
(CriticalSectionを使って、保護)
ストラテジー鈴木 <
delphi...@freeml.com> さんは書きました。<2017/04/
10>
----------
Tomomi Umezawa
um...@procast.co.jp
MLホームページ:
http://www.freeml.com/delphi-users
----------------------------------------------------------------------
■即戦力人材と企業をつなぐ転職サイト■
ビズリーチに【無料登録】すると・・・
・一流企業の求人情報を閲覧できます
・ヘッドハンターからスカウトが届きます
ビズリーチ【無料登録】ページはこちら
http://ad.freeml.com/cgi-bin/sa.cgi?id=pQugc
------------------------------------------------------[freeml byGMO]--