【发布时间】:2018-05-23 15:50:11
【问题描述】:
我要做的是从串行端口读取信息并根据接收到的数据在三种不同形式之间切换的信息亭应用程序。表单也可以通过按钮相互切换。
简化:
1 Form1 在收到数据之前一直处于活动状态
2主程序读取数据
3 form1 关闭
4 form2打开并详细说明接收到的数据
点击了 5 个 form2 按钮
6 form3 打开
7 表 2 已关闭
8 循环重启
我的方法 就是用这个例子 https://www.codeproject.com/Articles/7536/How-To-Swap-Top-Level-Forms?msg=969882 我对 ApplicationContext 进行了修改,但如果我使用原始示例,它可以工作,但我不知道如何使用委托传递方法,如果我使用修改后的代码,则可以传递委托 bu 表单冻结并且有时表单无法打开。我不确定这是最糟糕的方式,我无法将读取的串行数据移动到 form1
有什么建议或例子吗?
public class MainFormManager : ApplicationContext
{
protected bool exitAppOnClose;
// original
//Declare delagete callback function, the owner of communication
public SetOrderDelegate ProcessOrder;
public Form CurrentForm {
get { return MainForm; }
set {
if (MainForm != null) {
// close the current form, but don't exit the application
exitAppOnClose = false;
MainForm.Close();
exitAppOnClose = true;
}
// switch to the new form
MainForm = value;
MainForm.Show();
}
}
// modified
private Frm1 frm1;
private Frm2 frm2;
private Frm3 frm3;
public void ShowFrm1()
{
if (frm1 == null) {
frm1 = new Frm1();
frm1.Closed += mainFormClosed; // avoid reshowing a disposed form
this.ProcessOrder += new SetOrderDelegate(frm1.ProcessOrder);
MainForm = frminizio;
MainForm.Show();
} else {
frm1.Activate();
}
}
private void mainFormClosed(object sender, EventArgs e)
{
frminizio = null;
}
public void ShowFrm2()
{
if (frm2 == null) {
frm2 = new Frm2();
frm1.Closed += frm2Closed; // avoid reshowing a disposed form
//this.ProcessOrder += new SetOrderDelegate(frm3.ProcessOrder);
MainForm.Close();
MainForm = frm2;
MainForm.Show();
} else {
frm2.Activate();
}
}
private void frm2Closed(object sender, EventArgs e)
{
frm2 = null;
}
public void ShowFrm3()
{
if (frm3 == null) {
frm3 = new Frm3();
frm3.Closed += frm3Closed; // avoid reshowing a disposed form
//this.ProcessOrder += new SetOrderDelegate(frm3.ProcessOrder);
MainForm.Close();
MainForm = frm3;
MainForm.Show();
} else {
frmPaga.Activate();
}
}
internal sealed class Program
{
public Program()
{
//all other stuff
Application.Run(mainFormManager);
}
static void SerialReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(500);
//SetTextDeleg BcRun = BarCodeRun;
string data = serial.ReadLine();
if (data == true) {
// this is only a semplyfied example //
frm1.setdata(data);
task.loop (2000);
frm2.setdata(data);
frm1.close();
frm2.open();
}
}
}
【问题讨论】:
标签: c# multithreading forms