yumeの日記: C#学習 15 4
コメントありがとうございます。
●マルチスレッド
・マルチスレッドとは、コンピュータが計算する処理の流れを複数持つこと。
>処理を分けることで、入力待ちしながら計算したりできる。
・一度使ったスレッドを使いまわしたり、うまくやってくれるのが「Task」
・排他制御
例えばひとつの変数を、複数のスレッドが同時にいじろうとすると、どのタイミングでどういじられるか予想できない。場合によっては、1000万回に一回しか起きないようなバグが生まれるかもしれない。
それでは困るので、誰かがいじってるときは他はいじれなくするのが排他制御
同時に一つのスレッドしか処理できないところを「クリティカルセクション」とよぶ
クリティカルセクションに入る前に、あるオブジェクト(同期オブジェクト)を「ロック」する。ロックされている同期オブジェクトに、ほかのスレッドが処理しにこようとしたときは、そこで一旦止まってロックが外れるのを待つ。
System.Threading.Monitorクラスを使う。けどlock文を使う方が見やすい。
var syncObject = new object();
lock(syncObject)
{
//クリティカルセクション
}
>Console Adventureで言えば
・プレイヤーが入力するスレッド inputThread
・画面に出力するスレッド outputThread(というかメインスレッドか)
の二つに分けて、
outputThreadは今何をしてるかを示す状態変数を持ってて
inpuThreadはいつでも入力は受け付けるけど、outputの状態に応じて処理を変える
(無視、文字列即表示、コマンド命令へ入力?)
とかかなぁ。
C#でブラックジャック
友人からこんなのが送られてきた
ので、試しにやってみた。
3時間ほどかかってしまったが、特にひっかかりもなくできたのでよし。
解説を見て気づいたこと:
・A J Q Kを数字のまま出力してた
・Deckクラスは作ったものの、カードを配るというメソッドはGameクラスに置いていた。
・クラスの継承とか使ってない(単純にプレイヤークラスで、ディーラーとプレイヤーを作っていた)
Gameクラスがいろいろやりすぎかもなぁ。確かに読み返すとちょっと入り組んでてあかんな。作ってても混乱することがあったし。
で、友人に送ってきたら動かないと。自分の環境では同じexeで動くから、.NETのランタイム(?)とかが関係してるのかな。
>ランタイムを同梱したバージョン(自己完結ファイル)で送ったら動いた。ついでにバグも少し直した。
実行しようとしたらエラー (スコア:0)
Windows 10ですが
A fatal error occurred. The required library hostfxr.dll could not be found.
というエラーが出て実行できませんでした。
.Net Core ライブラリのインストールが必要みたいですね。
Re:実行しようとしたらエラー (スコア:2)
こちら [firestorage.jp]なら動くかもしれません。ランタイムを同梱したバージョン(らしい)です。
Re: (スコア:0)
うまく動きました。対応ありがとうございます。
この人面白い (スコア:0)
なんというかこうやりたいことに合わせてあっちこっち飛んでいくので見ていると面白い。
さっきまでサッカーやってたのにクリケット始めたとかさっきまで東京にいたのに今ニューヨークくらいあっちこっち飛ぶ。
なかなか効率的に勉強している印象もありますね。私が yumeさんの時期なら単純にループとタイマで頑張ってただろう。