2026年4月6日月曜日

visual studio C# Rev.0.4 通らぬ引数

本日もC#でアプリのデバッグをやっている.

アプリ画面のプルダウンリストで設定を選ぶ
 →なぜか表示に反映されない

という悩みで昨日あたりから悩んでいた.

内部を調べると、表示ルーチンの中に引数が入って行かない.そんなことある?

ところが動かし方を変えると正常化する.
アプリ画面を一旦停める
 →プルダウンリストで設定を選ぶ
  →再度動かす
   →表示に反映される

あっ、と気づいた.

その表示ルーチンは
 Task.Run(() => DataLoop(select))
なる別スレッドを起動したら勝手にloopで自走するのであった.
通らない引数はselectである.

スレッド起動時に渡した引数はloopを停めるまで不変なのだった.これが原因.

とすると、プルダウンリストを選んだら表示を一旦停めて再起動しなくちゃいけないじゃない.ダル~

あ~ぁ もう今日は投了だぁ投了

ーーーー
これが出ました.コピロットに月額$10支払えと言われました.お金を払わないと4月はもう使えません.やっぱり限度があった.
お金を支払いました.¥1597だったかな.円安.

ーーーー
さてAIにはこんな質問を投げた.
「static methodをthreadでRUNさせて永久loopさせる.そのstatic methodに外部変数を随時与えたい.どうしたらいい?」

AIはまずこんな回答を出してきた.
「直接引数で渡そうとすると、スレッド開始時の値で固定されてしまう」
そうそうまさにこの症状なんだよ.

AIはさらに続ける.
「引き渡すのが数値(int)1つであれば、最もシンプルで確実なのは volatile 修飾子 を使った共有変数か、より厳密なスレッド安全性を確保できる Interlocked クラス を使う方法です」
意味わかんねぇ....

どうやらこうゆうことのようだ.
まず、thread RUNされる側のclassでUIに即時反応させたい変数を宣言しとく.
 public static volatile int scale_sel = 0;
volatileをつけるのが重要.

つぎに、上位のUI classでプルダウンリストが変化したときに、
 DataCal.scale_sel = 1;
のようにthread側の内部に直接手を突っ込めばよい.
少し気味が悪いが動くようになった.

かしこ

2 件のコメント:

  1. ポンコツ風紀委員とスカートの丈が不適切なJKとの話
    くらいでいいでしょうか 本日 毒者

    返信削除