暇人おやじの暇なつぶやき
× [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型を定義することでスレッドの制御をプログラム内で行なえる 複数ソケットの受け入れには、アクセプト処理やコネクト処理を早々に終わらせないとならない点も注意しなければならない |
カレンダー
カテゴリー
フリーエリア
最新CM
最新TB
ブログ内検索
|