忍者ブログ
暇人おやじの暇なつぶやき
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]
×

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

■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行のコードで目的の値を引っ張るようにはいかない


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

.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)


■新年あけましておめでとう

ブログを始めて早くも1年が経ちました
このブログはC++をマスターするために筆者が試行錯誤して色々なことにチャレンジする様子を綴るつもりで始めたのですが、1年・・・当初に比べるとどうにかVC++でコードを書くこともでき、スレッドやソケット等のプログラミングも動く程度にはできるようになった気がします

.NETのコードはある程度同じように書けるので、VBであったりVCであったりそれほど違和感を感じません

MSのサンプルが非常に親切にできているので、これを参考にして日々試行錯誤を繰り返すという作業で素人にも.NETでのプログラミングができるのでとても勉強になります

今年はより新しい技術やWeb等(SilverLight、Blend)にも積極的にチャレンジしていきたいと思う今日頃ごろでR

■非同期ソケット概要

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

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

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

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

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

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

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

複数ソケットの受け入れには、アクセプト処理やコネクト処理を早々に終わらせないとならない点も注意しなければならない
■ソケットの相手が切断したを知るために

サーバー側で複数の接続を処理している場合、相手から切断されたらそのソケットを破棄して以後はそのソケットを処理しない様にしなければならない

その為、相手(クライアント)からの切断要求をうけいれるようにしないとならない
これには 「BeginDisconnect」 を使う そしてまたこれもcallback関数
http://msdn.microsoft.com/ja-jp/library/system.net.sockets.socket.begindisconnect.aspx
を参考にどうにか実装

参考ページにはVBのサンプルがないので、c#のサンプルを改造して、どうにかうまくいったけど
マイクロソフトのページって、サンプル自体もそのままじゃ動かないから、超大変でR

てことでコードは次のような感じ

        client.BeginDisconnect(True, New AsyncCallback(AddressOf DisconnectCallback), client)

このBeginDisconnect はクライアントの処理中に記載
んで、次のがcallback関数「DisconnectCallback」
    Private Sub DisconnectCallback(ByVal ar As IAsyncResult)
        ' 切断要求の処理
        ' Complete the disconnect request.
        Dim client As Socket = CType(ar.AsyncState, System.Net.Sockets.Socket)
        Console.WriteLine("Disconnect:" & client.RemoteEndPoint.ToString())
        client.EndDisconnect(ar)

        ' Signal that the disconnect is complete.
        '   disconnectDone.Set()
    End Sub
disconnectDoneというのはC#の記載で、どうもイベントの通知のようなのですが、これをVBでどのようにするか不明なので、コメントアウト とりあえずはこれで切断の要求に応えることは出来た
■BeginAccept で複数のクライアントと接続を試みる

socket通信でサーバープログラムを書く場合、サーバーになるためには複数の接続先からの接続要求に
応えないとならない

.NETには「TcpListener」などの受信を行なうためのクラスが用意されているが、単純にこれを使った場合には
複数からの接続に対応は出来ない

そこで、socketクラスのBeginAcceptを実装することで、複数の接続から対応するコードを書く

しかしこれには「Callback」関数を定義しなければならない、また.NETでのコールバックはデリゲートで
なんたらかんたら・・・という説明が色々出てきて、ハッキリ言おう、よく分からん

でだ
http://codezine.jp/article/detail/22?p=1 にあるサーバーのプログラムというコードと
http://msdn.microsoft.com/ja-jp/library/5bb431f9.aspx にある例を見つつ

どうにかこれらcallbackの動きを把握できた

通常の接続待ちではブロックされるため、socket.accept()命令でプログラムは待機する

しかし、BeginAcceptを使った場合、待機は別スレッドが行い、本体は次のコードを実行する
なので、socket.accept()のコードを単純にBeginAcceptに変更しただけではまったく意味がないのでR




忍者ブログ [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:
忍者 シオ才
性別:
非公開
バーコード
ブログ内検索