【发布时间】:2015-07-06 11:01:59
【问题描述】:
我有一个函数用于更新 GUI 上显示的一些信息。信息应该只显示很短的时间(大约 10 秒)。
用于设置 GUI 上显示内容的函数被重复调用,显示的内容取决于该函数内的条件。
我目前遇到的问题是,显示的某些信息需要根据显示的时间进行更改。
我尝试创建一个在函数开始时设置为系统时间的变量,然后在函数的后期,如果当前系统时间大于原始时间,则会更改变量的值系统时间 + 10 秒。
但是,这样做的问题是,由于该函数被重复调用,因此每次调用/迭代都会更新原始系统时间。
我在 SO 上发现了以下问题:How to run code inside a loop only once without external flag? 并尝试实现 Angew 在答案中建议的内容,以便保存原始系统时间的变量只会在循环中设置一次。我的代码目前如下所示:
struct rnOnce{
template <typename T>
runOnce(T &&f){ f(); }
};
...
void updateHeader(){
...
static runOnce a([](){
timeWarningStarted = SimulationTime::Instance()->getSimulationTime();
});
...
但是当我运行我的程序并附加到调试中的进程时,对static runOnce a([](){... }); 的调用似乎被跳过了——我在这些行上放置的断点都没有被命中,即使这些行上的断点就在之前和之后。
谁能向我解释这是为什么?我在这里做错了什么?
编辑
期望的行为是timeWarningStarted 变量只被赋予一次值,尽管它被设置在一个被多次调用的函数中。它是一个全局变量 - 设置其值的函数将被连续调用,因为它用于更新 GUI 上显示的内容。
实际上,我希望将timeWarnigStarted 设置为第一次执行此代码时的当前系统时间,然后在程序运行期间保留其值。
在将我的代码更改为上面的代码之前,我有类似的东西:
void updateHeader(){
...
timeWaringtarted = SimulationTime::Instance()->getSimulationTime();
...
}
但这是有问题的,因为每次运行此函数时都会为 timeWarningStarted 提供当前系统时间(即,它会不断更新)。因此,稍后在同一个函数中,当我想检查警告是否已显示 10 秒,如果是,为了阻止它显示,我正在执行以下操作:
void updateHeader(){
...
timeWarningStarted = SimulationTime::Instance()->getSimulationTime();
...
currentSimulationTime = SimulationTime::Instance()->getSimulationTime();
if(currentSimulationTime <= (timeWarningStarted + 10)){
warningMessage = "";
}
...
}
但很明显,由于每次运行上述代码时,timeWarningStarted 和 currentSimulationTime 都会被赋予一个新值,因此它们的值会太接近,因为它们几乎会在同一时间被设置。
因此,通过在 runOnce 中设置 timeWarningStarted,我希望 timeWarningStarted 只会在第一次运行此代码时被赋予一个值,并在模拟期间保留该值,但是看来这部分代码现在永远不会运行...
static runOnce a([](){
timeReplyFailWarningStarted = SESL::SimulationTime::Instance()->getSimulationTime(); // = 0;
});
【问题讨论】:
-
RunOnce 解决方案设计过度,你可以这样做
static const auto once = (timeWarningStarted = blahblah); -
寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及重现它所需的最短代码在问题本身。没有明确的问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example。
-
我更全面地描述了所需的行为。