会社員KNIGHTの趣味三昧(卓球・盆太鼓・色々!)

会社員KNIGHTの趣味三昧(卓球・盆太鼓・色々!)

PR

Calendar

Category

カテゴリ未分類

(0)

卓球

(1195)

盆太鼓・盆踊り

(407)

トイドローン

(21)

その他

(334)

■■■■■■↓以下は凍結カテゴリー↓■■■■■■

(0)

KATS(自動売買プログラム)

(87)

「VB.NETで自動売買」入門

(24)

本日の取引

(1292)

デイトレ結果(勝ち)

(365)

デイトレ結果(負け)

(591)

夜間取引結果

(15)

今週の取引

(480)

今月の取引

(103)

明日の監視銘柄

(54)

株関連

(55)

草野球

(36)

Keyword Search

▼キーワード検索

Comments

accelwin@ Re[4]:【卓球】シェイクのラケット反転について(11/23) KNIGHTさんへ ご返信ありがとうございます…
KNIGHT@ Re[1]:【卓球】シェイクのラケット反転について(11/23) accelwinさんへ ブログへのコメント、どう…
accelwin@ Re:【卓球】シェイクのラケット反転について(11/23) 61歳でカットマンに挑戦し、2カ月目に突…
KNIGHT@ Re[1]:単身赴任を終え兵庫に戻ります(06/28) Tomohiro Takahashiさんへ コメント有難う…
Tomohiro Takahashi@ Re:単身赴任を終え兵庫に戻ります(06/28) お疲れ様でした。そのうち、私も頑張って…
KNIGHT@ Re[1]:第1回 日中杯 SpinOnline(WSS団体戦)(04/14) fukufuku1789さんへ いえいえ。むしろ私が…
fukufuku1789 @ Re:第1回 日中杯 SpinOnline(WSS団体戦)(04/14) 一緒に試合に出てくださりありがとうござ…
KNIGHT@ Re[1]:第15回 朝霧オープン卓球大会(チームマッチ)(01/21) fukufuku1789さんへ お疲れ様でした。今回…
fukufuku1789 @ Re:第15回 朝霧オープン卓球大会(チームマッチ)(01/21) 惜しい試合が多かったですね。 また卓球し…
KNIGHT@ Re[3]:2023年度台東区オープン年代別後期団体戦(12/10) マニャさんへ コメントどうも有難うござい…
May 25, 2008
XML
この「VB.NETで楽天RSSから~」シリーズがこの記事で10回目を迎えました。
始めた時には、このネタだけで10回も続けるとは思っても見ませんでした。

さて今回は、いよいよ複数銘柄の複数項目について更新通知を受けて処理をする
ChangeValue()メソッドの実装を行います。
「何を言ってるの?」と思われた方は<その9>までをご覧下さい。

ChangeValue()メソッドの定義だけは終わっています。中身が空ですが。
では中にコードを追加していきます。

このメソッドに紐付けたイベントハンドラは、エリアリンク(8914.T)、
サイバーファーム(2377.OJ)、YOZAN(6830.Q)の3銘柄について監視している項目に

監視している項目はそれぞれ、現在値と出来高でした。

まずはChangeValue()メソッド中で、どの銘柄についての変更通知か判断する
必要があります。
それを知るには、引数である 「sender」 を使用します。
senderとはイベント通知を行ったオブジェクトそのものの事です。
つまり、監視している3銘柄いずれかのDDEクライアントのインスタンスという事に
なります。
ちょっと専門用語になるので分からない方はやり方だけ参考にして下さい。
senderをDDEクライアントに変換しますが、それを「キャスト」と呼びます。
イベント通知を行ったDDEクライアントを特定するためにsenderをDdeClientに


Dim client As DdeClient = DirectCast(sender, DdeClient)

これで変数「client」を使って、どの銘柄がこのメソッドを呼び出したのかが
分かります。 「Topic」 というプロパティには「2377.OJ」などが入っています。

どの銘柄の更新通知か特定したら、次はどの項目に変更があったかを知る必要が
あります。今回の場合は現在値か出来高です。
「e」 で分かります。
e(型はDdeAdviseEventArgs)には 「Item」 というプロパティがあり、ここに
項目名が入っています。e.Itemが何であるかを確認すれば良いのです。

肝心の「変更された項目の値」ですが、これは<その8>で解説しています。
引数eのプロパティ「Data」にバイト配列で値を持っているんでしたね。

それでは、これらの情報を元にコーディングします。
今回は画面に表示する準備はせず監視の開始ボタンと終了ボタンしか作ってません。
なので変更通知は「出力」ウィンドウに表示させる事にします。

Console.WriteLine("ABC")

と書けば、出力ウィンドウに「ABC」と表示されます。
「WriteLine()」というメソッドは出力した後改行するという意味なので、
次に同じメソッドを呼び出せば次の行に書かれます。
もし

Console.Write("ABC")

と書いたら出力後改行しないので、2回連続で同じ事を書いても

ABCABC

になります。参考まで。

また、更新された銘柄を特定する時、IF文で条件分岐させても良いのですが
今回は 「Select~Case文」 を使用しています。

こんなコードになりました。

WS000058.JPG

前回まで使っていた「バイト配列を文字列に変換する方法」だと出来高が文字化けして
しまうので、以前 micorosoftさん がコメントしてくれた 「CInt」 を使って変換しています。
この関数を使って変換される方が簡単なので、整数値の項目を変換する時には
利用しましょう。

引き続き停止ボタンのメソッドも実装しましょう。
Form2.VB[デザイン] の監視終了ボタンをダブルクリックします。

処理内容は、DdeClientのインスタンスが入ったlistを元に、全ての
DDEクライアントを破棄してやれば良いです。

この部分に関するコードの解説は、ちゃんとしようと思えばそれなりに長くなるので
ここでは「こんな風になります」に留めます(汗)。興味のある方は勉強してみて下さい。

WS000054.JPG

これで一旦コーディング終了です。
待ち遠しかった方、お待たせしました。では実行してみましょう!!
開始ボタンを押してForm2が開いたら「監視開始」ボタンをクリックしてみて下さい。

出力ウィンドウに何か出てきましたか?(下はあくまでも例です)

WS000059.JPG

何か結果が出てきてます!
もしかしたら6項目が全て出ない方もいらっしゃると思います。
何度かやったらたまに出てこないとか。
それは 「デバッグ実行」しているから だと思います。

出力ウィンドウの表示を消すにはこのボタンを押して下さい。

WS000056.JPG

今回は出力ウィンドウに表示するだけでしたが、実際運用する時には
データベースに書き込んだりする必要が出てくるでしょう。
その時にはChangeValue()メソッドの中身を書き換えてやる必要があります。
またその時、一番厄介な「マルチスレッド処理」を実装する事になります。
ChangeValue()メソッドは複数のスレッドが同時に呼び出して実行しており、
メソッドの書き方によってはそれぞれのスレッドが影響を受けて結果が正しく
ならない可能性が出てきたり、間違った対処により処理が遅延したり最悪は
プログラムが負荷増大により固まったりする事があります。

この部分についてどこまで解説するか(出来るか)。悩ましいです。
これで「VB.NETで楽天RSSからリアルタイム情報を取得する」シリーズを終了するか
それともマルチスレッド処理についてもう少しだけ書くか。
明日以降に考えたいと思います。今回はちょっと含みを持たせたまま終了します。





お気に入りの記事を「いいね!」で応援しよう

Last updated  May 26, 2008 08:20:20 AM
コメント(4) | コメントを書く


■コメント

お名前
タイトル
メッセージ
画像認証
上の画像で表示されている数字を入力して下さい。


利用規約 に同意してコメントを
※コメントに関するよくある質問は、 こちら をご確認ください。


こんばんは。  
ひろ さん
いつもお疲れ様です。
KNIGHTさんのおかげで、
RSSからの収集はできるようになりましたが、
こういう情報をBlogに載せて頂けると、
非常に勉強になります。
マルチスレッド対応についても
難しいと思いますが、とても興味がありますので、
次回期待しています。 (May 25, 2008 10:09:15 PM)

間違った記事でした。  
ac_knight  さん
ひろさん
>いつもお疲れ様です。
>KNIGHTさんのおかげで、
>RSSからの収集はできるようになりましたが、
>こういう情報をBlogに載せて頂けると、
>非常に勉強になります。
>マルチスレッド対応についても
>難しいと思いますが、とても興味がありますので、
>次回期待しています。
-----
すみません。ひろさんに読んで頂いた記事は間違っていて、日記の内容を
修正しました。
出力ウィンドウに正しく表示されないのは私のプログラムのミスです。

何度も実行すると確かに6行出ない時もありますが、それはデバッグ実行のせいで
スレッドが飛んでるのかなぁと思います。

Console.WriteLine()はスレッドセーフなので、修正したChangeValue()メソッドは
正しく動作します。
実際運用する時はデータベースへの書き込み等が発生するので、その時に
マルチスレッドを考慮する必要がありますが。

間違った情報を書いてしまいすみません。m(_ _)m
(May 25, 2008 11:08:18 PM)

マルチスレッド  
micorosoft さん
 各スレッドの処理経過をまとめて特定の画面上にカッコ良くコンソール風に表示させたいのですが、なかなか難しくあれこれ試行錯誤しているこの頃です。
 1スレッド内も同期型の処理があるとストールしてしまうかも知れないので、スレッド終了をタイマー監視することも必要で、スレッド間でのやり取りが複雑になりますね。キレイで分かりやすい実装が出来ないものかと悩んでます。
 後、マケスピの起動はどのような仕組みで起動させてますか?私はUWSCで組んでいますが、最近は自動更新のダイアログが出てきたり画面遷移の予測が難しくなってしまいました。ログインだけ実行させることが出来れば良いのですが…
(May 26, 2008 09:10:13 PM)

お疲れ様です!  
ac_knight  さん
micorosoftさん
> 各スレッドの処理経過をまとめて特定の画面上にカッコ良くコンソール風に表示させたいのですが、なかなか難しくあれこれ試行錯誤しているこの頃です。
> 1スレッド内も同期型の処理があるとストールしてしまうかも知れないので、スレッド終了をタイマー監視することも必要で、スレッド間でのやり取りが複雑になりますね。キレイで分かりやすい実装が出来ないものかと悩んでます。
> 後、マケスピの起動はどのような仕組みで起動させてますか?私はUWSCで組んでいますが、最近は自動更新のダイアログが出てきたり画面遷移の予測が難しくなってしまいました。ログインだけ実行させることが出来れば良いのですが…
-----
マルチスレッドに関しては、私はBackgroundWorkerを使用しています。
スレッドの終了はRunWorkerCompletedイベントやDisposedイベントをハンドリングしています。

マケスピの起動は私もUWSCを使用しています。
まずマケスピの起動・停止をショートカットで行う事が出来る「MarketSpeedShortcut(mss)」で
ショートカットキーを割り当て、UWSCでmssを起動したのちそのショートカットキーを入力する
という事で対応してます。
同時に楽天RSSも起動出来るので便利です(楽天RSSの停止は自動で行わないようですが)。
(May 27, 2008 08:11:03 AM)

【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

© Rakuten Group, Inc.
Design a Mobile Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: