Правильно остановить таймер и обновление трея
От: justas_ms  
Дата: 25.03.10 09:45
Оценка:
Доброго дня,
Язык программирования C#. Есть два вопроса.

Первый:
Не могу нормально завершить работу таймера.

Вызов:
timer1.Tick += new EventHandler(timer1_Tick);
                        timer1.Interval = 3000;
                        timer1.Start();


Обработка:
 private void timer1_Tick(object sender, EventArgs e)
        {
            string otvetServera = CConnect.Connect(); // Получение ответа от сервера
            
            if (otvetServera == "Error") // Если ответ Error
            {
                timer1.Stop(); // Останавливаем таймер 
                MessageBox.Show("Проблема с сервером");
                //exitFlag = true;
                return; // Остановка обработки
            }
            
           MessageBox.Show(otvetServera); // Если все нормально выдаем ответ
                        
        }


По return происходит переход на строку string otvetServera = CConnect.Connect(); А необходимо выйти из обработчика, не вызывая сторонние функции.

Второй:
В программе использую NotifyIcon, но при некорректном завершении работы иконка остается в трее. Есть вариант сделать эмуляцию проведения мышки (пока не знаю как правильно это реализовать в шарпе). Может кто подскажет еще какие-нибудь варианты?

Заранее спасибо за ответы.
Re: Правильно остановить таймер и обновление трея
От: Kalina9001  
Дата: 25.03.10 09:56
Оценка: 3 (1)
Здравствуйте, justas_ms, Вы писали:

_>Первый:

_>Не могу нормально завершить работу таймера.

_>Вызов:

_>
_>timer1.Tick += new EventHandler(timer1_Tick);
_>                        timer1.Interval = 3000;
_>                        timer1.Start();
_>


_>Обработка:

_>
_> private void timer1_Tick(object sender, EventArgs e)
_>        {
_>            string otvetServera = CConnect.Connect(); // Получение ответа от сервера
            
_>            if (otvetServera == "Error") // Если ответ Error
_>            {
_>                timer1.Stop(); // Останавливаем таймер 
_>                MessageBox.Show("Проблема с сервером");
_>                //exitFlag = true;
_>                return; // Остановка обработки
_>            }
            
_>           MessageBox.Show(otvetServera); // Если все нормально выдаем ответ
                        
_>        }
_>


_>По return происходит переход на строку string otvetServera = CConnect.Connect(); А необходимо выйти из обработчика, не вызывая сторонние функции.


Может так?
 private void timer1_Tick(object sender, EventArgs e)
        {
                      timer1.Stop(); // Останавливаем таймер 
            string otvetServera = CConnect.Connect(); // Получение ответа от сервера
          
            if (otvetServera == "Error") // Если ответ Error
            {
                MessageBox.Show("Проблема с сервером");
                return; // Остановка обработки
            }
            else
            {
                            timer1.Start();
                        }    
          
           MessageBox.Show(otvetServera); // Если все нормально выдаем ответ
                      
        }
... << RSDN@Home 1.2.0 alpha 4 rev. 1446>>
Re[2]: Правильно остановить таймер и обновление трея
От: justas_ms  
Дата: 25.03.10 10:03
Оценка:
Kalina9001, спасибо, попробую.
Re[2]: Правильно остановить таймер и обновление трея
От: justas_ms  
Дата: 25.03.10 10:18
Оценка:
Здравствуйте, Kalina9001, Вы писали:

_>>По return происходит переход на строку string otvetServera = CConnect.Connect(); А необходимо выйти из обработчика, не вызывая сторонние функции.


K>Может так?

K>
K> private void timer1_Tick(object sender, EventArgs e)
K>        {
K>                      timer1.Stop(); // Останавливаем таймер 
K>            string otvetServera = CConnect.Connect(); // Получение ответа от сервера
          
K>            if (otvetServera == "Error") // Если ответ Error
K>            {
K>                MessageBox.Show("Проблема с сервером");
K>                return; // Остановка обработки
K>            }
K>            else
K>            {
K>                            timer1.Start();
K>                        }    
          
K>           MessageBox.Show(otvetServera); // Если все нормально выдаем ответ
                      
K>        }
K>


Всеж не то, переход происходит на timer1.Stop();, т.е. получается опять не выходит, а повторяет все с первой строки.
Re[3]: Правильно остановить таймер и обновление трея
От: Alex Dav Россия  
Дата: 25.03.10 10:23
Оценка:
Здравствуйте, justas_ms, Вы писали:



_>Всеж не то, переход происходит на timer1.Stop();, т.е. получается опять не выходит, а повторяет все с первой строки.

незнаю как такое может происходить, но делайте тогда так:
 private void timer1_Tick(object sender, EventArgs e)
       {
                      timer1.Stop(); // Останавливаем таймер 
           string otvetServera = CConnect.Connect(); // Получение ответа от сервера
          
            if (otvetServera == "Error") // Если ответ Error
            {
                MessageBox.Show("Проблема с сервером");

            }
            else
            {
            timer1.Start();
                      MessageBox.Show(otvetServera); // Если все нормально выдаем ответ
        }    
          
          
                      
       }
Re: Правильно остановить таймер и обновление трея
От: Alex Dav Россия  
Дата: 25.03.10 10:25
Оценка: +1
Здравствуйте, justas_ms, Вы писали:

_>В программе использую NotifyIcon, но при некорректном завершении работы иконка остается в трее. Есть вариант сделать эмуляцию проведения мышки (пока не знаю как правильно это реализовать в шарпе). Может кто подскажет еще какие-нибудь варианты?


что значит "некорректном " — если это убивание процесса, то ничего не исправите, если это у вас программа падает — делать надо что бы не падала, или падала но правильно
Re[3]: Правильно остановить таймер и обновление трея
От: Kalina9001  
Дата: 25.03.10 10:34
Оценка:
Здравствуйте, justas_ms, Вы писали:
_>Всеж не то, переход происходит на timer1.Stop();, т.е. получается опять не выходит, а повторяет все с первой строки.

Странно, попробовал:
public partial class Form1: Form
{
    Timer timer1;
    public Form1()
    {
        InitializeComponent();

        timer1 = new Timer();
        timer1.Tick +=new EventHandler(timer1_Tick);
        timer1.Interval = 3000;

        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        timer1.Stop(); // Останавливаем таймер 
        string otvetServera = "Error";

        if(otvetServera == "Error") // Если ответ Error
        {
            MessageBox.Show("Проблема с сервером");
            return; // Остановка обработки
        }
        else
        {
            timer1.Start();
        }

        MessageBox.Show(otvetServera); // Если все нормально выдаем ответ

    }
}


В функцию timer1_Tick заходит только одит раз
CConnect.Connect() — Это случаем не ассинхронно выполняется?
... << RSDN@Home 1.2.0 alpha 4 rev. 1446>>
Re[4]: Правильно остановить таймер и обновление трея
От: justas_ms  
Дата: 25.03.10 10:51
Оценка:
Kalina9001, Вы писали:

K>В функцию timer1_Tick заходит только одит раз

K>CConnect.Connect() — Это случаем не ассинхронно выполняется?

Нет, пока нет.
Re[3]: Правильно остановить таймер и обновление трея
От: Jolly Roger  
Дата: 25.03.10 10:54
Оценка:
Здравствуйте, justas_ms, Вы писали:

_>>>По return происходит переход на строку string otvetServera = CConnect.Connect(); А необходимо выйти из обработчика, не вызывая сторонние функции.


А Вы это под отладчиком смотрите? Скорее всего таймер успевает сработать ещё раз, пока Вы проходите метод пошагово.
"Нормальные герои всегда идут в обход!"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.