2015-03-21 12:07
Ui_01MenuB#ReadLine_TuginoItteSusumu(...) この関数を変えよう☆ww
参照箇所は2箇所☆
・Ui_01Menu#Komaokuri_GUI(...)
・Ui_01MenuLoop#Saisei
その前に、 Ui_PnlMain が画面で、
Ui_PnlMain#Response で再描画が始まるんだが、
これを、ボタンを押したときに 直接呼び出すのではなく、
1つ 間に 何か仲介を かまそう☆w
Ui_PnlMain#Response の使用箇所は次の7つ☆
・KifuNarabeImpl#Response(...)
・Ui_PnlMain#timer1_Tick(...) <その1>
・Ui_PnlMain#timer1_Tick(...) <その2>
・Ui_PnlMain#Ui_PnlMain_Load
・Ui_PnlMain#Ui_PnlMain_MouseMove
・Ui_PnlMain#Ui_PnlMain_MouseDown
・Ui_PnlMain#Ui_PnlMain_MouseUp
おっ☆ これは単純に 1個 に統一できたんだぜ☆w
・KifuNarabeImpl#Response(...)
ふむ☆
次に、 Ui_PnlMain#Response(...) の引数の中には、 ResponseImpl response というのが
あるんだが、これを KifuNarabeImpl クラスのプロパティにしてしまいたいんだぜ☆
現状、引数を細かく渡しているんだが、
どんっ!
と、大きなグループで渡したい☆ これは イメージで説明すると、
きめ細かなプログラムのイメージ図
・ . ・ ・・ ・
・ .・ ・・・ ・
・・ ・ ・・ ・ ・ 精密で緻密☆!
・ ・ ・・ ・ だが手を付けにくい☆
・ ・・ ・・ ・ . ・
・ . ・ ・ ・
大きくまとめられたプログラムのイメージ図
● ・ ●
● ・ 荒くてすっぽ抜けているが、
・ ● 手を付けやすい☆!
・ ・
という感じなんだぜ☆ 後者にしたいんだぜ☆ww
ここで問題なのは、
マウスクリックや、通信、タイマーからの、指示の同時発生
なんだぜ☆ GUIが使われるようになりだした時代以降の
プログラムが複雑になる理由の1つに、
マルチタスク がある☆
父「部屋を掃除しろ」
母「宿題をしろ」
兄「寝ろ」
という指示が 同時に飛んできた 弟 は、どうすればいいだろうか☆?
部屋を掃除してから 宿題をし、寝る のがいいと わたしは思うんだが、
コンピューターの解答としては、 寝ながら掃除をしつつ宿題もする という
答えになるかもしれないんだぜ☆
順番に1つずつやるのを
シングルタスク、
同時進行でやるのを
マルチタスク という☆
ここでわたしは、
マルチタスクをなるべく禁止して、できるだけシングルタスク
にしたいんだぜ☆
なぜなら、さっき説明したとおり
緻密流 → かいつまみ流 にしたいからだぜ☆
かいつまみたいから、シングルタスクにする☆ww
緻密が嫌だから、シングルタスクにする☆ww
再掲しよう☆
Ui_PnlMain#Response の使用箇所は次の7つ☆
・KifuNarabeImpl#Response(...) ←棋譜の自動再生中
・Ui_PnlMain#timer1_Tick(...) <その1> ←タイマー
・Ui_PnlMain#timer1_Tick(...) <その2> ←タイマー
・Ui_PnlMain#Ui_PnlMain_Load ←.exeダブルクリック
・Ui_PnlMain#Ui_PnlMain_MouseMove ←マウス操作
・Ui_PnlMain#Ui_PnlMain_MouseDown ←マウス操作
・Ui_PnlMain#Ui_PnlMain_MouseUp ←マウス操作
ということで、
「棋譜の自動再生中」に「タイマー」が働きながら「マウス操作」もされる
と、父、母、兄 のマルチタスクになっているな☆
これを単純に いっしょくた に統合すると 弟 が爆発する可能性が高い☆
まず最初にやることは、
父、母、兄 を シングルタスクに沿わせる(順番を決めてしゃべれ)
にすることだぜ☆ これを実現する方法の1つに
排他処理(はいたしょり) がある☆
排他処理とは、スネ夫の言葉を借りれば
「このゲームは3人用なんだ☆ のび太はダメー」
で言い表せるように、 特権を持つ者と、持たざるもの に分ける制度なんだぜ☆
今回、そんな排他処理の中でも シンプルな手法の1つ、
ミューテックス を
使ってみようと思うんだぜ☆
「この弟は1人用なんだ☆ 母、兄はダメー」
という手法だぜ☆ ひとりずつ入ってください、みたいな
文化祭のオバケ屋敷の 1人用バージョン みたいな感覚だぜ☆
オバケ屋敷の出口に 受付がいて、 オバケ屋敷の中に今、客がいるかどうか
覚えておく☆
オバケ屋敷の入り口にも 受付がいて、入っていいか 出口の受付と連携を取るんだぜ☆
この仕組みで重要なのは、
カウントを取る方ではなくて、
待たせている客をどうするのか
の方なんだぜ☆
「マウスクリックをしたんだぜ☆ でも何も起きないんだぜ☆! バーロー!」
となるのか、
「タイマーは今回無視して、マウスクリックを優先しよう」
となるのか、
「マウスクリックとタイマー、合体させて1人の客にしてしまおう」
とするのか、
「棋譜再生が優先だろう。マウスクリックとタイマーは無視しよう」
とするのか、ルールを決めておく必要があるんだぜ☆
(1)起動 の解決中は、他全部 は無視する☆
(2)棋譜再生モードの解決中は、タイマー、マウスクリック は無視する☆
(3)マウスクリックの解決中は、タイマー は無視する☆
(4)タイマー の解決中は、次のタイマー を無視する☆
という感じで良さそうだな☆
16:25
メモ: W050_UsiLoop#AtLoop_OnPosition(...) から KifuNarabeImpl を参照するには、
どこだっけ☆ww
きふわらべ は、GUI を持っていなくて、
きふならべ は、GUI を持っているんだぜ☆
きふわらべ のメソッドの中から GUIのメソッドを参照しようとしている部分は
構造が怪しいんだぜ☆ww
17:30
将棋エンジン には GUI情報 は要らなくて、
将棋エンジンも GUIも、 棋譜情報 を持っているんだぜ☆
共通部分は、その差を飲み込むんだぜ☆
17:50
ServerInterface オブジェクトを、将棋GUIが持っていて、
それを将棋サーバーだと思って使うように作っている☆
使用箇所を一覧しておくぜ☆
・Ui_01Menu#Makimodosi ※[巻き戻し]ボタン
・Ui_01MenuB#ReadLine_TuginoItteSusumu ※[コマ送り]や[再生]
うむ、実質 2箇所だけか☆
(スレッド1)再描画を指示 → テキストボックスに棋譜入力
(スレッド2)タイマー→ テキストボックスの棋譜読取→[コマ送り]等を指示
棋譜の[巻き戻し]、[コマ送り]、[再生]を GUI がやっているんだが、
これを将棋サーバーに持って行きたいんだぜ☆
03:29
「棋譜パーサーA」という部品が、GUIと 将棋サーバー部の両方を兼ねていて
分割の障害になっているんだぜ☆
日曜日に直せるといいんだぜ~☆
微速微進☆ 寄り道 遅々前進☆w
[0回]
PR
http://grayscale.dou-jin.com/Entry/160/【将棋】めざせ世界コンピュータ将棋選手権☆(68) 電王戦も見つつも、きふわらべの改造を進めよう☆ww