Таймер говорит, что он включен, но никогда не выполняется - PullRequest
3 голосов
/ 31 марта 2012

У меня есть саб, который запускает один из двух таймеров (в зависимости от состояния «зоны»). Этот подпункт 'CheckAndActivateRelays' сам вызывается событием _DataReceived последовательного порта. Я вставляю точки останова, чтобы помочь мне устранить неполадки, и вижу, что строка tmrSoundSirensAfterDelay.Start () выполняется успешно, а состояние таймера даже меняется на включенный. Однако связанное событие Tick никогда не выполняет какой-либо код, содержащийся в нем.

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

Кто-нибудь? Спасибо

private void checkAndActivateRelays(int zoneNumber)
   {

       if (globalFullAlarmSet || globalNightAlarmSet || globalDoorsAlarmSet)
           {
               if (zoneNumber == 1) //Entry zone
               {
                   //kick off a timer after delay specified in Settings1 file,
                   if (Settings1.Default.alarmSirenDurationInMinutes != 0)
                   {
                       //activates the relays if global alarm flags are still set to true 
                       //(i.e. user has not entered code in time)
                       globalAlarmEntryDurationTicks = 0;                           
                       tmrSoundSirensAfterDelay.Start();

                   }
               }
               else //If any other zone is activated during alarm set condition
               {
                   if (Settings1.Default.alarmSirenDurationInMinutes != 0)
                   {
                       //Output to relays 1 & 2
                       spIOCard.Write("~out10=1~");
                       spIOCard.Write("~out11=1~");

                       //then close after duration from Settings1 file
                       globalAlarmSirenDurationTicks = 0;
                       tmrSoundSirens.Start();
                   }
               }

           }

   }

   private void tmrSoundSirensAfterDelay_Tick(object sender, EventArgs e)
   {
       globalAlarmEntryDurationTicks = globalAlarmEntryDurationTicks + 1;

       if (globalAlarmEntryDurationTicks == Settings1.Default.alarmEntryDelayInSeconds) //Value from Settings1 file
       {
           spIOCard.Write("~out10=1~");
           spIOCard.Write("~out11=1~");
           globalAlarmEntryDurationTicks = 0;
           tmrSoundSirensAfterDelay.Stop();
           tmrSoundSirens.Start();
       }
   }

   private void tmrSoundSirens_Tick(object sender, EventArgs e)
   {           
       globalAlarmSirenDurationTicks = globalAlarmSirenDurationTicks + 1;

       if (globalAlarmSirenDurationTicks == (Settings1.Default.alarmSirenDurationInMinutes * 5))  //*60 Value from Settings1 file
       {
           spIOCard.Write("~out10=0~");
           spIOCard.Write("~out11=0~");               
           globalAlarmSirenDurationTicks = 0;
           tmrSoundSirens.Stop();
       }
   }



private void button24_Click(object sender, EventArgs e)
   {
       globalFullAlarmSet = true;
       checkAndActivateRelays(1);
   }

Код получателя данных последовательного порта:

 private void spIO_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
       RxString = spIOCard.ReadExisting();

       if (RxString == "~in00=1~")
       {
           checkAndActivateRelays(1);
           button10.BackColor = System.Drawing.Color.Red;               
       }

       if (RxString == "~in00=0~")
       {
           button10.BackColor = System.Drawing.Color.LightGray;
       }

       if (RxString == "~in01=1~")
       {
           checkAndActivateRelays(2);
           button11.BackColor = System.Drawing.Color.Red;
       }

       if (RxString == "~in01=0~")
       {
           button11.BackColor = System.Drawing.Color.LightGray;
       }

       if (RxString == "~in02=1~")
       {
           button12.BackColor = System.Drawing.Color.Red;
       }

       if (RxString == "~in02=0~")
       {
           button12.BackColor = System.Drawing.Color.LightGray;
       }

}

Ответы [ 3 ]

1 голос
/ 31 марта 2012

Есть о чем подумать, поскольку вы используете DataReceivedEvent .По данным MSDN он поднят на вторичном потоке.Это, вероятно, вызывает вашу проблему.

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

0 голосов
/ 31 марта 2012

Ключевым моментом здесь является то, что вы делаете это в событии SerialPort DataReceived.Это событие вызывается в отдельном потоке.Это важно, потому что вы, вероятно, зарегистрировались для события Tick в главном потоке, но вы запускаете таймер в другом.Вам нужно зарегистрировать событие Tick в функции checkAndActivateRelays.Тогда он должен быть счастлив.

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

0 голосов
/ 31 марта 2012

Поскольку вызов Start () не является проблемой, настройка таймера - это то, что вам нужно искать.Убедитесь, что вы обработали тиковое событие И установили интервал.

 myTimer.Tick += new EventHandler(TimerEventProcessor);

   // Sets the timer interval to 5 seconds.
   myTimer.Interval = 5000;
   myTimer.Start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...