[delphi-users:4668] スレッドを使用したデータアクセスについて

46 views
Skip to first unread message

ストラテジー鈴木

unread,
Apr 10, 2017, 1:21:03 AM4/10/17
to delphi...@freeml.com
こんにちは、鈴木と言います。
いつも参考にして助けていただいています。

スレッドを使用したデータアクセスについて教えてください。
現在、次のような構成でプログラム作成しようと考えています。

○メインフォーム
 - QData: TQueue<MyRcd>; // Generics.CollectionsのTQueueを使いました。

○MyThread
 以下のようなコードでIndy経由で受信したデータをメインフォームの変数QDataに追加しています。
...
while not Terminated do
begin
...
if データ受信 then
// メインフォームのQDataに追加
Synchronize( ... );
...
end;
...

 受信したデータがQDataに保存されることは確認できました。
 質問はメインフォームのQDataに蓄えられたデータの取り出し方法です。
 メインフォーム上にタイマーコンポーネントを用意して、0.5秒間隔程度でQDataにデータが存在しているか確認し、存在していればキューから取り出そうと考えているのですが、この時、排他処理をするコードは必要でしょうか(CriticalSection等を使用してMyThreadからデータを追加できないようにするなど)。

よろしくお願いいたします。


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
スカルプケアの常識を凌駕する限界濃度!
髪の奥までぐんぐん届く!?
万が一実感できなければ全額返金いたします。
http://ad.freeml.com/cgi-bin/sa.cgi?id=pQtup
------------------------------------------------------[freeml byGMO]--

umez

unread,
Apr 10, 2017, 2:40:29 AM4/10/17
to delphi...@freeml.com
こんにちは、梅澤@プロキャストです。

「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]--

ストラテジー鈴木

unread,
Apr 10, 2017, 4:19:17 AM4/10/17
to delphi...@freeml.com
梅澤さん、返信ありがとうございます。

| 「Synchronize()をすれば、QData に対してEnqueueするのもDequeueする
| のも メインスレッドとなるので、QDataの読み書きの排他制御は不要で
| はないか?」というのが質問の意図だと思うのですが、いかがでしょう
| か?

 まさにその通りです(質問の意図が分かりづらくて、すみません)。
 全てメインスレッドで作業するので、排他制御は不要のようですね。

 ただ、やはりご指摘のようにメインスレッド側の処理の実装が気になっていま
した。
 メインスレッド側の処理はこれから実装してみるので、どれくらいの負荷にな
るのかが分かっていませんが、画像等を扱うので高くなると思います。

 アドバイスいただいた排他制御+PostMessage()を使用する方法で、再度検討
してみます!

ストラテジー鈴木
--

□--------------------------------------------------------■
 営業統括部
 鈴木 伸大郎
 e-mail: suz...@estrat.co.jp
 ストラテジー株式会社
 (新住所)
 〒182-0023 東京都調布市染地2-14-50
 Tel: 042-426-9876 Fax: 042-426-9875
■--------------------------------------------------------□


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
スカルプケアの常識を凌駕する限界濃度!
髪の奥までぐんぐん届く!?
万が一実感できなければ全額返金いたします。
http://ad.freeml.com/cgi-bin/sa.cgi?id=pQvk9
------------------------------------------------------[freeml byGMO]--

Reply all
Reply to author
Forward
0 new messages