2015-06-17 3 views
3

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

В настоящий момент он отслеживает сообщения с отмеченными перечислениями, заданными в параметрах uint paramsRequested и paramsUpdated. Но это нужно заменить чем-то другим. Потому что это не масштабируемо и не настраивается.

Пример перечисление:

public enum FunctionParameters : uint 
{ 
    None = 0, 
    StatusInterval = 1 << 0, 
    Delay = 1 << 1, 
    Time = 1 << 2, 
    ..... 
} 

электронного письмо передается по шине CAN-Bus и ждет asynchronosly на ответ.

Когда приходит сообщение:

_paramsUpdated |= (uint) FunctionParameters.StatusInterval; 

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

while (((uint)_paramsUpdated & (uint)param) == 0) 
{ 
    // Do nothing 
    Thread.Sleep(threadSleepTimeMS); 
    //Thread.Yield(); 
} 

Если это занимает слишком много времени, это приведет к исключению таймаута. Это работает в настоящий момент.

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

У меня нет проблем с тайм-аутом, это скорее архитектурная проблема, чтобы заменить флаги переполнения другой системой.

+0

Ваш вопрос не очень ясен. Почему это занимает слишком много времени? Почему бы вам просто не увеличить количество потоков потребителя \ производителя? –

+0

@ Kilanny Добавил несколько комментариев, чтобы сделать вопрос более понятным. – Gulpener

+0

Как насчет семафоров? –

ответ

1

я, может быть, есть решение сам:

Я добавил класс с именем ParameterFlag; Это выглядит Линк так:

public class ParameterFlag 
    { 
     public ParameterFlag(ParameterType parameterType, bool flag) 
     {   
      ParameterType = parameterType; 
      Flag = flag; 
     } 

     public ParameterType ParameterType 
     { 
      get; 
      set; 
     } 

     public bool Flag 
     { 
      get; 
      set; 
     } 
    } 

_paramsUpdated станет:

List<ParameterFlag> _paramsUpdated 

Когда приходит сообщение:

ParameterFlag flag =_paramsUpdated.Find(x=> x.ParameterType == ParameterType); 
    flag.Flag = true; 

Другого поток ждет, пока сообщение прибыло, чтобы использовать его и проверяет параметр принимается:

private void WaitParameterReceived(ParameterType param) 
{ 
    while (!_paramsUpdated.Find(x => x.ParameterType == param).Flag) 
    { 
     // Do nothing 
     Thread.Sleep(threadSleepTimeMS); 
     //Thread.Yield(); 
    } 
} 

Большое спасибо за ваши комментарии!