我正在重构由我的前任创建的软件。该软件可以通过can-bus进行通信。此时所有设备都在软件中进行硬编码,我的工作是使每个设备类型都可配置。 (保存在序列化类中,并使用模型创建者创建)。 使用该软件,可以配置,寻址和参数设置。
目前,它会跟踪在uints paramsRequested和paramsUpdated中设置的标记枚举的消息。但这需要用其他东西代替。因为这不可扩展和可配置。
枚举示例:
public enum FunctionParameters : uint
{
None = 0,
StatusInterval = 1 << 0,
Delay = 1 << 1,
Time = 1 << 2,
.....
}
通过can-bus发送消息,并在回复时异步等待。
当消息进来时:
_paramsUpdated |= (uint) FunctionParameters.StatusInterval;
另一个线程等到消息到达,使用它并检查参数是否被接收。
while (((uint)_paramsUpdated & (uint)param) == 0)
{
// Do nothing
Thread.Sleep(threadSleepTimeMS);
//Thread.Yield();
}
当这需要太长时间时,它会给出超时异常。这目前正如预期的那样。
问题是,有没有替代品不能使用枚举标记来跟踪这一点,因为新情况有多个灵活的标记。
我没有超时问题,用其他系统替换枚举标记更是一个架构问题。
答案 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();
}
}
非常感谢您的评论!