私はDelphiPrismを使用してMono用のソフトウェアを作成および構築しています。そこで、シリアル通信はスレッドで処理することにしました。プロジェクトのグローバル変数オプションを有効にしない限り、グローバル変数は厳密には許可されないため、DelphiPrismの規則に従うことにしました。では、どのようにしてパブリック変数またはフィールドをスレッドに渡したり、アクセス可能にしたりしますか?
これが私のテストメインフォームコードです:
MainForm = partial class(System.Windows.Forms.Form)
private
method SignalBtn_Click(sender: System.Object; e: System.EventArgs);
method CommBtn_Click(sender: System.Object; e: System.EventArgs);
method button1_Click(sender: System.Object; e: System.EventArgs);
method button2_Click(sender: System.Object; e: System.EventArgs);
method button4_Click(sender: System.Object; e: System.EventArgs);
method button5_Click(sender: System.Object; e: System.EventArgs);
method MainForm_Load(sender: System.Object; e: System.EventArgs);
method ShutdownBtn_Click(sender: System.Object; e: System.EventArgs);
method MySerialData(sender: System.Object; e:SerialDataReceivedEventArgs);
method LoginBtn_Click(sender: System.Object; e: System.EventArgs);
protected
method Dispose(disposing: Boolean); override;
public
RX:Array[0..5] of byte;
TX:Array[0..6] of byte;
serialPort1:System.IO.Ports.SerialPort;
thr:Thread;
stoploop:Boolean;
mcommand:Byte;
thechannel:Integer;
constructor;
method FillTable;
end;
シリアル通信のスレッドは次のとおりです。
ThreadComm = class(MainForm)
public
class procedure mythread; static;
end;
ThreadCommの実行方法は次のとおりです。
class procedure ThreadComm.mythread;
begin
while true do
begin
TX[0]:=$FF;
TX[1]:=$01;
TX[2]:=$01;
TX[3]:=$04;
TX[4]:=$A2;
TX[5]:=(TX[2] xor TX[3] xor TX[4]);
SerialPort1.Write(TX,0,6);
while SerialPort1.BytesToWrite>0 do;
Thread.Sleep(100);
if (stoploop) then
break;
end;
end;
コードをコンパイルするたびに、次のような30個程度の同様のエラーメッセージが表示されます。
インスタンス参照なしでインスタンスメンバー「SerialPort1」を呼び出すことはできません
エラーの意味はわかっていますが、それを解決する唯一の方法は、メインフォームのインスタンスを作成することです。これを行うと、メインプログラムのインスタンスと同じインスタンスにはなりません。この場合、フィールドまたはパブリック変数にアクセスする必要があるときは、常にmainformの新しいインスタンスを作成する必要があります。右?
class method Program.Main(args: array of string);
begin
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ThreadException += OnThreadException;
**using lMainForm := new MainForm do
Application.Run(lMainForm);**
end;
それらすべてを使用したいのですが、変数はスレッド内にあり、たまたまメインフォームのパブリックエリア内にあります。
ありがとう