【问题标题】:switch between forms from main program从主程序在表单之间切换
【发布时间】: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


    【解决方案1】:

    它冻结是因为您的 SerialReceived 方法中有 Thread.Sleep(500)。所以如果你得到一堆数据,你几乎总是会被冻结。

    您不应该在串行 IO 事件中出现线程暂停,因为它会备份数据,并且根据您使用的波特率,您可能会丢失数据(称为 UART 的底层芯片不携带大量板载内存来存储所有缓冲数据)。

    【讨论】:

    • sleep 只是为了这里的这个例子来说明一切如何工作,不包括在我的项目中,连续工作完美@angryHacker
    • 好的,你能确定程序挂起的代码行吗?
    • 例如当我调用 ShowFrm2() 时,我的问题是处理表单并将数据发送给它@angryHacker
    • @andymo ShowFrm2 中的哪一行导致挂起?
    • @andymo 关于跨线程,是的 - 你必须处理它 - 你迟早会得到它。 SerialReceived 在单独的线程上触发,您必须将其编组到您的 UI 线程。请参阅this 了解相关信息。
    猜你喜欢
    • 2011-11-25
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 2016-03-24
    • 2012-11-11
    • 1970-01-01
    • 2012-09-26
    • 2019-04-07
    相关资源
    最近更新 更多