忍者ブログ
暇人おやじの暇なつぶやき
[1] [2] [3]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

■Threadプログラムを作る

.NETによるスレッドプログラムは意外と簡単だ
MSのサンプル
http://msdn.microsoft.com/ja-jp/library/system.threading.thread.aspx

Imports System
Imports System.Threading
Module Thread1

    'Class ThreadExample
    Sub ThreadProc()
        Dim i As Integer
        For i = 0 To 9
            Console.WriteLine("ThreadProc: {0}", i)
            Thread.Sleep(0)
        Next
    End Sub
    'End Class



    Sub Main()
        Dim t As New Thread(AddressOf ThreadProc)

        t.Start()
        'Thread.Sleep(0)

        Dim i As Integer
        For i = 1 To 4
            Console.WriteLine("Main thread: Do some work.")
            Thread.Sleep(0)
        Next

        Console.WriteLine("Main thread: Call Join(), to wait until ThreadProc ends.")
        t.Join()
        Console.WriteLine("Main thread: ThreadProc.Join has returned.  Press Enter to end program.")
        Console.ReadLine()

    End Sub

End Module

Start命令でスレッドが起動する
Join命令は呼び出し元をブロックする
結果は次の通り、Joinの呼び出しでブロックされるため、スレッド部分のみ動く

ThreadProc: 0
Main thread: Do some work.
ThreadProc: 1
Main thread: Do some work.
ThreadProc: 2
Main thread: Do some work.
ThreadProc: 3
Main thread: Do some work.
ThreadProc: 4
Main thread: Call Join(), to wait until ThreadProc ends.
ThreadProc: 5
ThreadProc: 6
ThreadProc: 7
ThreadProc: 8
ThreadProc: 9
Main thread: ThreadProc.Join has returned.  Press Enter to end program.
PR
■値の保持...その2

昨日のStringDictionaryは保持する値がStringに限定されるため普段使う際には重宝しそうだ
色々と探ってみると、これら値保持について扱うSystem.Collectionsにはオブジェクトを保持する事ができる
そこで簡単な例としてHashtableを扱ってみる

次のようなオブジェクトを作成しそれを保存してみる

    Class MyObj
        Public MyName As String
        Public MyAge As Int16
    End Class

名前と年齢という2つのデータを持つオブジェクトMyObj、これをボタン押下でHashtableに追加してみる
フォームにボタン2つとテキストボックス2つを配置してコードを記載して実行だ

Public Class Form1
    Class MyObj
        Public MyName As String
        Public MyAge As Int16
    End Class

    Dim openWith As New Hashtable()

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Human1 As MyObj = New MyObj
        Human1.MyName = TextBox1.Text
        Human1.MyAge = Convert.ToInt16(TextBox2.Text)
        openWith.Add(TextBox1.Text, Human1)

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim wHuman As MyObj = openWith(TextBox1.Text)
        Dim wAge As Int16 = wHuman.MyAge

        MsgBox(wAge)
    End Sub
End Class

テキストボックス1に名前
テキストボックス2に年齢

何件か入力し、名前だけ入力してボタン2を押すと、その名前の年齢をMSGBOXされる
例によってスペースの入力時のエラーは考慮していない
■値の保持に・・・

DelphiのIndexOfNameメソッドはとても使いやすい
しかも簡単でR

そこで、色々と探したところ、どうも「キー=値」のリストを保持するのは.NETでは出来ないようだ
これは考え方の違いなのか、VB.NETで値の保持を探すと「キー」=「値」という割付で保持するらしいことが分かる

ではこの形式で保持する方法で一番簡単そうなものが、タイトルのStringDictionaryっぽい

これはSystem.Collections.Specializedに有る

次がもっとも簡単であろうコードでフォームにボタン二つとテキストボックス2つを配置する

    Dim SD As System.Collections.Specialized.StringDictionary

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        SD(TextBox1.Text) = TextBox2.Text

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        SD = New System.Collections.Specialized.StringDictionary
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        MsgBox(SD(TextBox1.Text))
    End Sub

空白は考慮していないのであしからず

■DelphiのIndexOfNameに変わるメソッドは?

Key=値 を外部ファイルに保存しておき、実行時にこの値を使う方法としてDelphiにはTstringsクラスにIndexofnameが用意されている
これは簡単にkeyで示される値を取得できるのでとても便利でR

Windowsの3.1の頃にはこのリストはiniファイルに存在し、iniファイルを扱う簡単なメソッドが用意されていたが、このDelphiのTstringsはそれをはるかに凌ぐ使う易い機能であると思う

今回VB.NETにこれと同等の機能をさがしたのがなかなか見つからない
Windows95からiniファイルはレジストリに変わり、このようなリストで保持する機能は必要ないと考えたのだろうか?.NET(VS2003)の世界になるとさらに変わり、configファイルにキーと値を保持するようにもなっているようだがこのようにころころ変わるMSの仕様ではなくリストに「KEY=値」で保持するのがはるかに良いと思うのだが

そこで、色々と調べると「IDictionary」「Collections 」等のキーワードが引っかかった
「IDictionary」のサンプルでそれらしいことが出来るようだが、しかしDelphiのようにIndexOfName(キー)で簡単に1行のコードで目的の値を引っ張るようにはいかない


何か良い方法はないものか・・・
■完成したプログラムを配布する場合

.NETでコンパイルしビルドしてできたプログラムは、デバッグ環境のままとなっている
C++の場合には、ビルド時に「Release」を選ぶことで配布可能なexeが出来上がる

しかしVBの場合、それがない

というか、構成マネージャには「Release」が選べるのだが、それを選んで出来上がるexeはデバッグ環境のままのため、配布しても起動しない

ではどうするか?

発行を行なうのでR

発行はClickOnceのためのSetUpプログラムを簡単に作成してくれる優れものだが、これによるセットアップは更新などを自動で行なう代わりにプログラムのインストール先が選べない

しかしこの処理で出来上がるexeファイルはれっきとした実行プログラムでR

そこで、そのプログラムを配布すれば良いわけだ
そのexeファイルは アプリケーション名.exe.deployとなっているので、最後の拡張子「.deploy」を消してしまえば良いのだ(これはWeb配布を考慮してあるため、拡張子が付加されているだけのよう)

ClickOnceについてはMSさんのHPをどうぞ
http://msdn.microsoft.com/ja-jp/library/142dbbz4.aspx
■16進から10進を簡単に得る

        Dim chr As String = "0A"
        Dim i As Integer = Convert.ToInt16(chr, 16)
        Console.WriteLine("i:" & i.ToString)

Convert.ToInt16 による指定で簡単に変換が行なえる
逆もまた指定可能ですが、hex関数による方がパラメータが少ないことと、出力が大文字になる

・ToInt16での逆指定(i=10、出力は「a」)

        chr = Convert.ToString(i, 16)
        Console.WriteLine("chr:" & chr)

・Hex関数での指定(i=10、出力は「A」)
        chr = Hex(i)
        Console.WriteLine("chr:" & chr)


■非同期ソケット概要

ソケット通信を行う際の注意点
相手からのデータを待つ際、ブロックしていまう

ブロックとは?これは「待ち」が発生する事を意味する
この待ちがあると、プログラムは他のことが出来なくなる

そこで、非同期に行なうことで、このブロックを発生させなくするのだ
非同期のために、.NETではIAsyncResultデザインが用意されているという

非同期のソケットについては
http://msdn.microsoft.com/ja-jp/library/fx6588te(VS.80).aspx
にサンプルが乗っている
このサンプルにはクライアント、サーバーとあり、少しの修正で動くので非常に参考になるかと思う

ただし、BeginReceive等に受け渡すオブジェクトを独自にクラスで用意しているので、これらをsocket渡しにした簡単なものがあれば、もう少し理解しやすいと思う

また前回の切断を感知する方法を非同期受信と絡める場合には、スレッドの同期取り等の処理が発生する

これはManualResetEvent型を定義することでスレッドの制御をプログラム内で行なえる

複数ソケットの受け入れには、アクセプト処理やコネクト処理を早々に終わらせないとならない点も注意しなければならない


忍者ブログ [PR]
カレンダー
08 2024/09 10
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
フリーエリア
最新CM
最新TB
プロフィール
HN:
忍者 シオ才
性別:
非公開
バーコード
ブログ内検索