2014-01-01
../images/visualcalc/rp.jpg

Screenshot of VisualCalc Release Preview

喋る電卓ソフトVisual Calc.初めて大きなプログラムを書きました. .Net Framework 4.5, C# 5, WPFを用いたもので,Windows Vista以降で動作します.

機能

喋る機能

数字を読み上げてくれるのがこの電卓の特徴です. ボタンを押すたびに喋ってくれます.(三角関数とかは…無い)

マスコット機能

電卓の横で応援してくれます. Release Preview以降は削除されていました. これいる?

../images/visualcalc/mascot.jpg

Mascot feature

税金の計算

税金の計算もできます.初期設定が5%なので,時代を感じます.(2021年現在10%)

../images/visualcalc/tax.jpg

Tax is 5%

途中で8%になってる.

../images/visualcalc/tax2.jpg

Tax is 8%

21億桁計算機能

String型の最大文字数が21億(32ビット符号付きの最大値)なので,21億桁計算できます.(やったことはない.)

../images/visualcalc/release.jpg

100! on Visual Calc Release v1.01

グラフ

申し訳程度の機能.今ならWindows標準の電卓にあります.これいる?

../images/visualcalc/graph.jpg

Graph on Visual Calc Release v1.01

謎機能

これいる?

../images/visualcalc/tools.jpg

Tools on Visual Calc Release v1.01

小話(初めてのマルチスレッド)

そして,21億桁計算機能はめちゃくちゃ時間がかかる場合があったので,UIがフリーズしてしまいます. そのために,別スレッドで計算をすることが必要でした. 当時は,Async/Awaitが出たばかりで,.Net Frameworkにはあまたのスレッド生成の方法があります.(Threadクラス, ThreadPool.QueueUserWorkItem, Task.Factory.StartNew, Task.Run) そのために,わけわからず,次のようなコードを書いていたり.

await Task.Factory.StartNew(( o ) => {
    Tuple<int, BigDecimal> data = (Tuple<int, BigDecimal>)o;
    NextNumberBig = BigDecimal.Sqrt(data.Item2, data.Item1);
    return data.Item2;
}, new Tuple<int,BigDecimal>((int)ConmaScroll.Value, bd) ).ContinueWith((t) => {
    StateLabel.Content = "√";
    HistoryAppend("sqrt(" + t.Result.ToString() + ")");
    LoadingWindow.Visibility = Visibility.Collapsed;
    IsEnabled = true;
}, TaskScheduler.FromCurrentSynchronizationContext());

こうでいいはずです.

int csv = ConmaScroll.Value;
var bd2 = bd;
await Task.Run(() => {
    NextNumberBig = BigDecimal.Sqrt(bd2, csv);
});
StateLabel.Content = "√";
HistoryAppend("sqrt(" + bd2.ToString() + ")");
LoadingWindow.Visibility = Visibility.Collapsed;
IsEnabled = true;

SynchronizationCotextの闇に入るぐらいならSemaphoreDispatcherObjectを使った方がいいですね.

Screenshot of VisualCalc beta2
VisualCalc Beta 2
Screenshot of VisualCalc beta3
VisualCalc Beta 3