Я пишу и собираю программное обеспечение для Mono с использованием Delphi Prism. Итак, я решил, что моя последовательная связь будет обрабатываться потоком. Поскольку глобальные переменные строго запрещены, если вы не включите опцию глобальной переменной для проекта, я решил следовать соглашению с Delphi Prism. Итак, как вы можете передать или сделать общедоступные переменные или поля доступными для потока?
Вот мой тестовый код mainform:
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. Если вы сделаете это, то это не будет тот же экземпляр, что и экземпляр основной программы. Если это так, то вам придется создавать новый экземпляр 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;
Я хочу использовать все переменные, которые находятся в потоке, и они находятся в публичной области mainform.
Спасибо