void ControlLoop::main_loop() { InitializeAndCheckHardware(pHardware) //pHardware is a pointer given from outside //The main loop while (m_bIsRunning) { simulated_time += time_increment; //this will probably be += 0.001 seconds ReadSensorData(); if (data_is_bad) { m_bIsRunning = false; goto loop_end; } ApplyFilterToData(); ComputeControllerOutput(); SendOutputToHardware(); ProcesspendingEvents(); while ( GetWallClockTime() < simulated_time ) {} if ( end_condition_is_satisified ) m_bIsRunning = false; } loop_end: DeInitializeHardware(pHardware); }
pHardware指针从ControlLoop对象外部传入并具有多态类型,因此对我来说使用RAII并在main_loop中创建和破坏硬件接口本身没有多大意义.我想我可以让pHardware创建一个临时对象,代表硬件的“会话”或“使用”,可以在main_loop退出时自动清理,但我不确定这个想法是否会让某些人更清楚否则我的意图是什么.循环中只有三种方式:第一种方法是从外部硬件读取坏数据;第二个是如果ProcesspendingEvents()指示用户启动的中止,这只会导致m_bIsRunning变为false;最后一个是如果在循环的底部满足结束条件.我还应该注意,main_loop可以在ControlLoop对象的生命周期内多次启动和完成,因此它应该在m_bIsRunning = false之后干净地退出.
另外,我意识到我可以在这里使用break关键字,但是main_loop中的大多数伪代码函数调用并没有真正封装为函数,只是因为它们需要有很多参数,或者它们都需要访问成员变量.在我看来,这两种情况都比让简单地将main_loop作为一个更长的函数更加混乱,并且由于big while循环的长度,像goto loop_end这样的语句似乎对我来说更清晰.
现在提出一个问题:如果您在自己的代码中编写它,这个解决方案会让您感到不舒服吗?它确实对我有点不对劲,但之后我从未在C代码中使用过goto语句 – 因此我请求专家帮助.我还缺少哪些其他基本想法可以使这些代码更清晰?
谢谢.
解决方法
但是,如果这些函数调用中的任何一个都可以抛出异常,或者如果你最终需要多次中断,我宁愿使用RAII样式的容器,这就是析构函数的确切类型.你总是执行对DeInitializeHardware的调用,所以……
// todo: add error checking if needed class HardwareWrapper { public: HardwareWrapper(Hardware *pH) : _pHardware(pH) { InitializeAndCheckHardware(_pHardware); } ~HardwareWrapper() { DeInitializeHardware(_pHardware); } const Hardware *getHardware() const { return _pHardware; } const Hardware *operator->() const { return _pHardware; } const Hardware& operator*() const { return *_pHardware; } private: Hardware *_pHardware; // if you don't want to allow copies... HardwareWrapper(const HardwareWrapper &other); HardwareWrapper& operator=(const HardwareWrapper &other); } // ... void ControlLoop::main_loop() { HardwareWrapper hw(pHardware); // code }
原文地址:https://www.jb51.cc/c/117497.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。