Разное поведение в switch при разных контекстах выполнения
От: kvser  
Дата: 11.01.09 12:39
Оценка:
Здравствуйте!

Есть поток1 и поток2. Поток1 — генератор команд GUI, поток2 — система передачи команд до цели и получения ответных данных.

В каждой команде указывается адрес устройства, какую функцию и подфункцию должно выполнить устройство и собственно данные для выполнения данной подфункции.
В каждом ответе на команду есть адрес устройства, какую функцию и подфункцию выполнило устройство, признак ответа и собственно данные описывающие результат выполнения. При этом на некоторые команды(когда команда может выполняться продолжительное время) может придти несколько ответов: 1 — ответ о получении команды устройством, 2 — ответ с результатами выполнения по истечении некоторого времени; для чего и служит признак ответа.

Поток1 формирует команды для внешних устройств(исходя из введенных пользователем данных)и обрабатывает ответы (показывает пользователю пришедшие данные в удобном виде).
Поток2 передает команды устройствам (в виде последовательности байт из потока1), получает пришедшие данные(последовательность байт), посылает копию данных потоку1, далее анализирует эти данные(например сравнивает адрес, фукнцию, подфункцию, CRC, признак ответа) и решает:
1) ждать следующего ответа от данного устройства, а статус команды перевести в "Выполняется устройством";
2) пришел окончательный ответ на команды и команду необходимо удалить из очереди
3) Это не ответ на отосланную команду (например после сбоя физической линии передачи), ждать ответа дальше

Поток1, получив данные от потока2, анализирует не только адрес, фукнцию, подфункцию, CRC, признак ответа, но и данные описывающие результат выполнения. Также все переданные данные и пришедшие данные поток1 показывает пользователю в отдельном окне.

Вот тут получается, что при ответе и поток1 и поток 2 фукнцию, подфункцию. А это выглядит так:

switch(байтФункции)
{
  case F1:
  {
    switch(байтПодфункции)
    {
      case SF1:{...} case SF2:{...}...и т.д.
    }
  }
...и т.д.
}

Но при этом действия в телах "case SFx" в потоке1 и потоке2 отличаются, т.е. эта функция в потоке2 просто возвращает логическую переменную, что это ответ или не ответ; а в потоке1 эта функция соответствующим кейсу образом обрабатывает в ответе данные результата, после чего результат показывается пользователю в удобном виде.

Дак вот при добавлении/удалении функций и подфункций приходится менять код "switch(байтФункции)" в двух местах, что часто приводит к ошибкам при больших switch. Как можно выполнять различные дествия в case при разном контексте использования? Можно switch заменить чем-то другим, это не важно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.