DOBON.NET DOBON.NETプログラミング掲示板過去ログ

同期通信とスレッドについて

環境/言語:[WindowsXP VB.NET 2003]
分類:[.NET]

はじめまして。tomyです。

環境はWindowsXP/VB.NET2003です。

■やりたいことは下記のとおりです。
-------------------------------------------------------------------
1.画面起動・ソケット接続
2.5秒周期でバイナリファイル参照し、
  変更があれば画面表示

以下、2で変更があった場合
3.変更通知をメッセージ送信
  (変更が5箇所あれば5回送信)
4.送信元から応答受信(タイムアウト10秒)
  →正常に応答受信の場合は2に戻る
5.タイムアウトまたは、異常応答(NAK)受信の場合は
  リトライをする。
6.リトライに失敗した場合、エラーログ出力し、
  2に戻る
-------------------------------------------------------------------

今、当方で考えているのは、、、
上記2で変更があった場合、スレッドを生成し、
(毎回だと5秒周期でスレッドを生成)
同期通信にて送受信しようと考えております。
タイムアウトはSetSocketOptionを使用しようと考えております。

そこで下記ご教示いただけないでしょうか?

@受信待ち中に画面の終了要求がきた場合の処理について
 (therad.IsBackground = true
  socketのcloseのみでOKでしょうか?)
A都度スレッドを生成するほうが良いのか
 それともスレッドは終始起動し、
 イベントのみをスレッドで検知するようにする
 ほうが良いのでしょうか?
 (後者の場合、その手段もご教示頂けましたら助かります。)


以上、長くなりましたがどうぞ宜しくお願い申し上げます。
サンプルを書いてみました。
http://dobon.net/cgi-bin/up/files/042.zip
コードに恥ずかしい部分もありますが、何か参考になれば・・・。
 
Thread.Joinメソッド、
AutoResetEvent.WaitOneメソッド、
AutoResetEvent.Setメソッド、
Socket.Closeメソッド、
Socket.Pollメソッド、
Catch ex As IOException、
Catch ex As SocketException、
Catch ex As ObjectDisposedException
このあたりを使って書いています。
 
※ VB2008で書いたので、Usingブロックや、Dictionary(Of〜)や、IsNot演算子を使っています。
  申し訳ありませんが、ご了承下さい。
H.K.R.さん、プログラムありがとうございました。
どんぴしゃの内容で感動です。。。
(しかもサーバ側まで、、、)

頂いたプログラムで終了イベントで即thread終了できました。

それで、画面上の「停止」ボタン押下の時には、現状の内容を破棄し
即「停止」メッセージを送信できるようにしたいと思い、
自分なりにいろいろ調べていたのですが、
こちらの下記の過去ログからソケットを一旦終了して
AutoResetEventをsetすれば良いのかナ???
と考えました。

http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=22182&rev=&no=0

もし考えが間違っておりましたらご指摘頂けないでしょうか?
この投稿はマルチポストです。

●マルチポストされている場所
http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=7713&page=0

----------
この掲示板ではマルチポストが禁止されています。詳しくは、「書き込みのマナーについて」をお読みください。

●書き込みのマナーについて
http://dobon.net/vb/bbs/index.html
tomyです。。。
マナー違反申し訳ございませんでした。。。
(掲示板に書き込んだ経験があまりなく、指摘を受けるまで
こういうことがマナー違反ということに気付きませんでした。。。)
以後気を付けたいと思います。
また、下記のサイトの方にもお詫びの書き込みを致しました。

> http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=7713&page=0



■No22354に返信((報告)さんの記事)
> この投稿はマルチポストです。
>
> ●マルチポストされている場所
> http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=7713&page=0
>
> ----------
> この掲示板ではマルチポストが禁止されています。詳しくは、「書き込みのマナーについて」をお読みください。
>
> ●書き込みのマナーについて
> http://dobon.net/vb/bbs/index.html
コードをバージョンアップ(と修正)してみました。
結構長くなったので、読みづらくなりましたが・・・(汗
http://dobon.net/cgi-bin/up/files/043.zip

リトライ機能、1Clientで複数ファイル監視に対応(ファイル監視処理自体は未実装)。ボタンを押すと通信Cancel、再開ができるようにしてみました。
返信遅くなりまして本当にすみませんでした・・・
かなり高機能で、びっくりです。。。
ありがとうございました。
というか、最初のプログラムの方にも書いて
頂いてたのをこちらが、見落としていました。(大変失礼しました。)

結局下記のようなロジックで様子を見ることにしました。

---------------------------------------------------
@アプリケーション起動時にスレッド生成
A5秒周期でバイナリの差分チェック
 (1)差分ありの場合、
     1.差分個数セット
     2.ソケットクローズ
     3.AutoResetEventのセット
 ※停止ボタンの場合も2・3
Bスレッド側
 (1)WaitOne()で待機
 (2)終了時は即抜け
 (3)以下差分個数ループ
     1.ソケット接続
     2.送信
     3.受信待ち
       タイムアウトまたはNAKの場合
       リトライ回数分1・2・3
 (4)ソケットクローズ
---------------------------------------------------

本当にありがとうございました。




■No22362に返信(H.K.R.さんの記事)
> コードをバージョンアップ(と修正)してみました。
> 結構長くなったので、読みづらくなりましたが・・・(汗
> http://dobon.net/cgi-bin/up/files/043.zip
>
> リトライ機能、1Clientで複数ファイル監視に対応(ファイル監視処理自体は未実装)。ボタンを押すと通信Cancel、再開ができるようにしてみました。
>

DOBON.NET | プログラミング道 | プログラミング掲示板