始めまして。初心者です。
どうしても解決できないことがあり、投稿させていただきました。
前提・実現したいこと
WindowsFormにてシリアル通信アプリケーションを作成しています。
データの送受信処理はTimerスレッドを用いて一定時間間隔でデータの送受信を行います。
(実現したいこと)、
Timerスレッドを開始したのち、メインスレッドのWindowsFORMにあるテキストボックスから値
を取得したい。
具体的には、以下の手順で処理をしたい(当該部の詳細はソースコードを参照下さい)
(0) ボタンクリックするとTimerスレッドが開始(btnConnect_Clickイベント)
(1) TimerスレッドからMyGUIfunctionクラスで定義したDoGetSlaveID()をコール。
(2) DoGetSlaveID()は、
・別スレッドからメインスレッドへのアクセスがあるとき、
myFormControl1.doGetGUIByteDataDelegeteを渡す。
(3) doGetGUIByteDataDelegeteに登録されたGetSlaveIDを呼ぶ。
doGetGUIByteDataDelegete = new GetGUIByteData(GetSlaveID);
(4) テキストぼっくの値をByte型で変数に取得。
byte slaveID = myGUIFuncClassObject.DoGetSlaveID();
発生している問題・エラーメッセージ
error CS0029: 型 'void' を 'byte' に暗黙的に変換できません。
該当のソースコード
public partial class Form1 : Form { //Define Timer for TimerElapsedEventHandler System.Timers.Timer timer = new System.Timers.Timer(); // Byteの戻り値を持つ関数のDelegateの宣言 public delegate byte GetGUIByteData(); public GetGUIByteData doGetGUIByteDataDelegete; public Form1() { InitializeComponent(); // Byte戻り値を持つ関数をデリゲート登録 doGetGUIByteDataDelegete = new GetGUIByteData(GetSlaveID); //ボタンクリックイベントを登録 btnConnect.Click += new EventHandler(btnConnect_Click); } // ボタンクリック時の処理関数 private void btnConnect_Click(object sender, EventArgs e) { //タイマー時間の設定 if (lbxSampleRate.Text != "") timer.Interval = Convert.ToDouble(lbxSampleRate.Text); // Set Default Time Period else timer.Interval = 1000; // Allow periodic timer events timer.AutoReset = true; // Hook up the Elapsed Event for the timer timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); // Timer Thread Start timer.Start(); } //Timerスレッドの処理関数 void timer_Elapsed(object sender, ElapsedEventArgs e) { MyGUIFunctionClass myFuncClassObject = new MyGUIFunctionClass(this); //byte slaveID = Convert.ToByte(txtSlaveID.Text); ★ byte slaveID = myGUIFuncClassObject.DoGetSlaveID(); ↑この文法でエラーが出ます。 } //テキストボックスから値をbyte型で取得 public byte GetSlaveID() { byte val = Convert.ToByte(txtSlaveID.Text); return val; } // ユーザフォームにアクセスする関数類はMyGUIFunctionClassに登録する public class MyGUIFunctionClass { Form1 myFormControl1; public MyGUIFunctionClass(Form1 myForm) { myFormControl1 = myForm; } public void DoGetSlaveID() { myFormControl1.Invoke(myFormControl1.doGetGUIByteDataDelegete); } }
試したこと
戻り値のない(void)処理関数の場合はエラーは出ません。
例:ボタンEnableをTrue、Falseにする
MyGUIFunctionクラスで
Public void DoButtonCont()
{
myFormControl1.Invoke(myFormControl1.doButtonContDelegete);
}
FORM1クラスで
public void ButtonControl()
{
Button1.Enable = True;
}
また、エラー発生箇所で直接値を設定すると
Timetスレッドは正常に動作しています。
↑カウンタの動作なども含め24時間では問題ありません。
slaveID=(byte)2;
補足情報(FW/ツールのバージョンなど)
Microsoft Visual Studio Enterprise 2017
Version 15.9.37
VisualStudio.15.Release/15.9.37+28307.1585
Microsoft .NET Framework
Version 4.8.04084
MyGUIfunctionクラスを設けた理由は
・ GUIのボタンなど各種フォームの追加に対し柔軟に対応したいため。
特に、Timerスレッドにて処理し、その結果をフォーム上に表示する
逆に、フォーム上の情報と受信したデータの情報比較をTimerスレッドで
行う必要があるため。
以上、宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー