我正在使用 Delphi Prism 为 Mono 编写和构建我的软件。所以,我决定我的串行通信将由一个线程处理。由于除非您为项目启用全局变量选项,否则严格不允许使用全局变量,因此我决定遵循 Delphi Prism 约定。那么,如何传递或使公共变量或字段可供线程访问?
这是我的测试主窗体代码:
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;
我想使用所有这些变量都在线程中,并且它们恰好在主窗体公共区域内。
谢谢