Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Трудности с таймером


Автор: okaton 18.12.2009, 11:11
Доброго времени суток. Благородные доны помогите подправить код. Написал АОН, но возникли трудности в этом месте:

Код

        public string str = "";
        private void timer1_Tick(object sender, EventArgs e)
        {   
            while (port.BytesToRead > 0)
            {
                try
                {
                    str = port.ReadLine();   
                    listBox1.Items.Add(str);                    
                    CallerID();                    
                }
                catch { }
            }  
        }

        public void CallerID()
        {
            string number = "";
            if (str.StartsWith("+CLIP:"))
            {
                number = str.Substring(str.IndexOf("\"") + 1, str.IndexOf(",") - str.IndexOf("\"") - 2);
                listBox2.Items.Add("Входящий звонок");
                listBox2.Items.Add("Время: " + DateTime.Now);
                listBox2.Items.Add("Номер определен: " + number);
                listBox2.Items.Add(" ");
            }
        }


Проблема в том, что пока телефон звонит номер постоянно определяется, т.к. он в таймере. Что тут можно предпринять? Кроме выключения таймера, потому что его потом как-то нужно включать, а это "как-то" - RING (при прослушивании порта), но он возникает через определенные промежутки времени при входящем звонке. Поэтому как таймер выключится, так сразу и включится. Условие по времени между рингами это вообще не вариант. Может флаг на открытую линию? Но что-то не получается. В общем мне на ум больше ничего не приходит. Подайте пожалуйста идею.

Автор: explorer 18.12.2009, 16:30
Как вариант (правда в случае, если RING не возникает слишком часто). Поступает звонок первый раз - запустить таймер и выставить флаг "разговора". При повторном RING проверять, не идет ли разговор (по флагу). Елси идет, значит и таймер не нужен. Если нет, то все с начала. А флаг разговора должен быть убран сразу после разрыва соединения.

Добавлено @ 16:42
А еще  можно без проверок флагов и таймера. Например, при первом RING выставляем свойство LineBuzy = true вот так:

Код

private bool lineBuzy;
public bool LineBuzy
{
     get { return lineBuzy; }
     set 
    {
       if (value != lineBuzy)
       {
            lineBuzy = value;
            if (value)
                 if (OnNewSession != null)
                    OnNewSession();
       }
    }
}


Ну и в обработчике события OnNewSession() вызывать
Код

while (port.BytesToRead > 0)
            {
                try
                {
                    str = port.ReadLine();   
                    listBox1.Items.Add(str);                    
                    CallerID();                    
                }
                catch { }
            }  

Автор: okaton 18.12.2009, 16:48
explorer, Поправка. Пока поступает звонок и не снята трубка модем шлет уведомления RING непрерывно (наверное, ну может через какой-то интервал). После определения номера можно отключить таймер, но как его потом включить? Значит нужен еще один таймер (где-то же уведомления должны обрабатываться). Можно поставить условие на функцию CallerID() и подписать его на флаг. Который отключится после определенного времени при отсутствии RING, но это криво :(

Добавлено @ 17:02
explorer, кхм, спасибо smile
я дико извиняюсь, но я нифига не понял  smile 

Автор: okaton 21.12.2009, 14:29
Кто знает как использовать SerialPinChange ?

Автор: okaton 21.12.2009, 22:18
Ну вот, приплыл: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "richTextBox1" не из того потока, в котором он был создан :(

Код

        void comport_PinChanged(object sender, SerialPinChangedEventArgs e)

        {
            if (e.EventType == SerialPinChange.Ring)
            {
                CallerID();
            } 
        }
        
        public string str = "";
        public void CallerID()
        {
            string number = "";        

            if (str.StartsWith("+CLIP:"))
            {
                number = str.Substring(str.IndexOf("\"") + 1, str.IndexOf(",") - str.IndexOf("\"") - 2);
                listBox2.Items.Add("Входящий звонок");
                listBox2.Items.Add("Время: " + DateTime.Now);
                listBox2.Items.Add("Номер определен: " + number);
                listBox2.Items.Add(" ");
                port.WriteLine("AT+CLIP=0");//АОН    
            }  
        }


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)