none
Баг в C# RRS feed

  • Вопрос

  • Timer timer1;
    
            public Form1()
            {
                InitializeComponent();
                timer1 = new Timer();
                timer1.Enabled = true;
                timer1.Interval = 1;
                timer1.Tick += Message;
            }
    
            bool once = true;
    
            private void Message(object sender, EventArgs e)
            {
                if (once)
                {
                    MessageBox.Show("a");
                    once = false;
                }
            }
    Почему программа при открытии много раз показывает сообщение?
    25 апреля 2012 г. 16:58

Ответы

  • Нет, бага нет.

    У вас две ошибки. Первая, вы каждый раз вместо проверки once на равенство true, присваиваете ему true. Правильно писать once == true, или т.к. once имеет тип bool просто once.

    Вторая ошибка заключается в том, что у вас MessageBox.Show не возвращает управление в метод, пока не закроется, а таймер в это время продолжает работать. Лезут новые окошки. Надо присвоение поставить до вызова MessageBox.Show.

    Правильный метод должен выглядеть так:

    private void Message(object sender, EventArgs e)
    {
        if (once)
        {
            once = false;
            MessageBox.Show("a");                
        }
    }


    25 апреля 2012 г. 17:10
    Отвечающий

Все ответы

  • Нет, бага нет.

    У вас две ошибки. Первая, вы каждый раз вместо проверки once на равенство true, присваиваете ему true. Правильно писать once == true, или т.к. once имеет тип bool просто once.

    Вторая ошибка заключается в том, что у вас MessageBox.Show не возвращает управление в метод, пока не закроется, а таймер в это время продолжает работать. Лезут новые окошки. Надо присвоение поставить до вызова MessageBox.Show.

    Правильный метод должен выглядеть так:

    private void Message(object sender, EventArgs e)
    {
        if (once)
        {
            once = false;
            MessageBox.Show("a");                
        }
    }


    25 апреля 2012 г. 17:10
    Отвечающий
  • MessageBox.Show не возвращает управление в метод, пока не закроется
    Спасибо запомню.

    Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.

    25 апреля 2012 г. 17:14
  • Если нужно сделать так, чтобы метод вызвался всего раз через определнный промежуток времени, то можно использовать таймер - System.Threading.Timer, в нем задается когда нужно первый раз вызвать обработчик и через сколько повторять (чтобы отключить повторение нужно задать этот параметр в Timeout.Infinite).

    Но этот таймер не синхронизирован с формой и выполнятся в отдельном потоке, т.е. если будите менять что-то на форме, то нужно будет делать это через вызовы Control.Invoke


    Для связи [mail]

    26 апреля 2012 г. 5:18
  • В рассматриваемом примере, если нужно выполнить ряд действий 1 раз после создания формы (но не в конструкторе), я бы вообще подписался на событие Load у формы и вообще бы не связывался с таймерами.
    26 апреля 2012 г. 5:21
    Отвечающий
  • я бы вообще подписался на событие Load у формы и вообще бы не связывался с таймерами.
    Я думал об этом но тут это не годилось, я вабшет пример привёл, а сама прога по другому, там в определённый момент нужно чтоб сработала, а не тогда когда форма запускается.

    Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.

    26 апреля 2012 г. 9:31