переключаться между формами из основной программы - PullRequest
0 голосов
/ 22 мая 2018

Что мне нужно сделать, так это приложение киоска, которое считывает информацию с последовательного порта и переключается между тремя различными формами в зависимости от полученных данных.формы также могут переключаться между собой с помощью кнопки.

simplyfing:

1 Форма 1 активна до получения данных

2 основная программа считывает данные

3 форма 1 закрыта

4 form2 открыт и обработан полученные данные

5 нажата кнопка form2

6 форма 3 открыта

7 форма 2 закрыта

8 циклrestart

Мой подход заключается в использовании этого примера https://www.codeproject.com/Articles/7536/How-To-Swap-Top-Level-Forms?msg=969882, и я делаю это изменение в ApplicationContext, но если я использую оригинальный пример, он работает, но я не знаю, как передать метод с делегатом, если яИспользовать модифицированный код может передать делегат, но форма не будет открыта.я не уверен, что это лучший способ, я не могу перевести считываемые последовательные данные в форму1

какие-либо предложения или пример для подражания?

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();

                }
            }
    }

1 Ответ

0 голосов
/ 22 мая 2018

Он зависает, потому что у вас есть Thread.Sleep(500) в вашем методе SerialReceived.Так что, если вы получите кучу данных, вы будете в значительной степени заморожены в любое время.

В последовательных событиях ввода-вывода не должно быть приостановок потоков, поскольку он создает резервные копии данных, и в зависимости от скорости передачи данных вы, скорее всего, потеряете данные (базовый чип, называемый UART, неу него много встроенной памяти для хранения всех буферизованных данных).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...