fc2ブログ

Hot Link

NDdeライブラリを使ったHot Linkの実装の説明をします。Cold Linkと比べるとやや複雑です。
スポンサーリンク

client = New NDde.Client.DdeClient("RSS", "8411.T")
client.Context.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
client.Connect()
itemMap = New Dictionary(Of String, String) ' Itemとその値を格納する
itemMap.Add("現在値", "")
itemMap.Add("現在値時刻", "")
itemMap.Add("出来高", "")
itemMap.Add("最良売気配値1", "")
itemMap.Add("最良買気配値1", "")
AddHandler client.Advise, AddressOf ChangeValue
For Each itemName As String In itemMap.Values
client.StartAdvise(itemName, 1, True, False, 1000, Nothing)
Next
9行目までは、Cold Linkと同じです。10行目で、値に変化があった場合に受信するChangeValueメソッドを登録しています。12行目で、StartAdviseメソッドを呼ぶことで、Itemごとに通知が開始されます。値が変更されるたびに、ChangeValueメソッドが呼ばれるわけです。なお、引数にはhot=True, acknowledge=Falseを渡しています。この理由は、「RSSがサポートするAdviseループはホットリンクで、かつRSSはXTYPF_ACKREQフラグの付いたAdviseループに対応していませんので、データに変化があればDDEクライアントの応答を待たずに次々とデータを供給」されるためです。
参考:http://www.softgate.jp/blogs/softgate/2009/04/-marketspeed-rss.html
値を受信するChangeValueメソッドは、以下のようになります。

Sub ChangeValue(ByVal sender As Object, ByVal e As NDde.Client.DdeAdviseEventArgs)
Try
Dim client as NDde.Client.DdeClient = DirectCast(sender, NDde.Client.DdeClient)
Dim topicName as String = client.Topic
If itemMap.ContainsKey(e.Item) Then
itemMap.Item(e.Item).Value = e.Text
End If
Catch ex As Exception
log.Warn("例外が発生しました。", ex)
End Try
End Sub
引数senderには、clientオブジェクトが格納されており、TopicプロパティでTopic名が取得できます。また、e.ItemからItem名、e.Valueからその値が取得できます。ここでのポイントは、ChangeValueメソッド内で発生した例外は、必ずこの中ですべてCatchする、ということです。というのも、私たちが例外をCatchできる機会はこの場所しかないからです。もし、例外をCatchしなかったら、ソフトウェアは停止しますので、注意してください。なお、ソフトウェアを終了させる場合は、以下のような終了処理を行いましょう。

For Each itemName As String In itemMap.Values
client.StopAdvise(itemName, 1000)
Next
RemoveHandler client.Advise, AddressOf ChangeValue
client.Disconnect()
スポンサーリンク
<<Cold Link | ホーム | 楽天RSSの300銘柄制限>>
コメント(0)
コメントの投稿
トラックバック(0)