0

C#2.0 – 無名関数をControl.Invoke()する

参考:ControlクラスのInvokeメソッドで匿名メソッドを使うには?[2.0のみ、C#] − @IT

GUI描画とは別スレッドから、GUI要素を書き換える時

this.Invoke((MethodInvoker) delegate() { /* GUIの操作*/});



MethodInvoker func = delegate() { /*GUIの操作*/ };
this.Invoke(func);

でいい。

例えば

try{
this.Invoke((MethodInvoker)delegate(){textBoxMsg.Text+="hogehoge";});
}
catch(Exceptionex){
Console.Error.WriteLine(ex.Message);
}

とか。

GUIと別スレッドからGUI要素を書き換える時は(例えばSocket通信を受信するためにThreadを立てて回している時など)

Form.Invoke(Delegate)を使わないとデッドロックが起こってしまうのでC#2.0からは直接スレッド越えのメソッド呼び出しができなくなった。

これは1年ぐらい前に勉強して理解できた。

s.h.log: C#のDelegateのカプセル化

s.h.log: C#2.0 – PhidgetRFIDkitを使ってみる (あとDelegateとかInvokeとか)

でも毎度Delegateを使っていると、ちょっとGUI要素を変えたいだけなのにゴミのような関数が大量に必要になってしまう。そこでLLでよくやるように無名関数でInvoke()を実行したかった。

しかし、C#の無名関数(匿名メソッド)の宣言と実行の方法は

delegate d = delegate(){ /* 処理 */ }; // 宣言
Thread th = new Thread(d); // 登録
th.Start(); // 無名関数呼び出し

で、Threadから呼び出す。

参考:MSDN: 匿名メソッド (C#)

これだと、GUIスレッド外からGUI要素を書き換えられない。Thread.Start()ではなくControl.Invoke()を使わなければならない。

Control.Invoke()の引数であるDelegateは無名関数宣言のdelegateとは別の型で、直接キャストができない。

が、なぜかMethodInvoker型にするとできる。

よくわからないけどとにかく

this.Inovoke( (MethodInvoker) delegate(){ /* 処理 */ });

でいける事がわかってコードがすっきりした。

1

C#講座01 SerialPortクラスを使ってArduinoと連動させる(1/2)

VS2005 C#のSerialPortコンポーネントを使って、Arduinoとシリアル通信して連携する方法をビデオ撮ってみた。

今回はマイコン→PCの一方方向だけしかやらなかったので、逆はあとでやる。

VisualStudio C#.NETで

・新規ソリューションを作る

・その中に新規プロジェクトを作る

・ボタンやシリアルポートコンポーネントなどを配置してみる

・コンポーネントにイベント登録する

という事を解説してみた。

ソースコード一式

今回書いたのはこれだけ。でも、これもほとんどVisualStudioに自動生成される。

publicForm1()

{

InitializeComponent();

Console.WriteLine(“start”);

}

privatevoidserialPort1_DataReceived(objectsender,System.IO.Ports.SerialDataReceivedEventArgse)

{

Console.WriteLine(serialPort1.ReadLine());

}

privatevoidbutton1_Click(objectsender,EventArgse)

{

serialPort1.NewLine=”¥r¥n”;

serialPort1.Open();

}

0

Arduinoボードを自作して、Flash+C#+Arduinoでフォトブラウザ作った

技術のエクササイズ、テクササイズの第9回課題Arduinoボードを作った。テクササイズのサイトはパスワードかかってますが。

Arduinoは何度も書いてるけど、Atmel ATmega8/ATmega168を使いやすくする開発環境で、基盤の仕様やブートローダーも全部オープンソースになっているプロジェクトです。

なのでArduinoボードを購入せずに、部品買ってきてゼロから自分で作る事もできる。

Handmaid Arduino-boardHandmaid Arduino-board

3時間以上かかった

オープンっていうか、RS232C-UART変換と16MHzの発振子を使うことを守れば、基本的に何でも良い。Arduinoのサイトにパーツリスト回路図があるが、今回は日本で入手しやすいパーツ(秋月や千石など。DigiKeyは小ロットだと高いので使わない)で作った。

Read more