【问题标题】:c++ how to get the current System time once inside a function that is called several times?c ++如何在多次调用的函数中获取当前系统时间?
【发布时间】: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 = "";
    }
    ...
}

但很明显,由于每次运行上述代码时,timeWarningStartedcurrentSimulationTime 都会被赋予一个新值,因此它们的值会太接近,因为它们几乎会在同一时间被设置。

因此,通过在 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
  • 我更全面地描述了所需的行为。

标签: c++ loops iteration


【解决方案1】:

要在第一次调用updateHeader() 时设置timeWarningStarted(不是之后,也不是之前),一个简单的技巧是

void updateHeader() {
    ...
    static bool warningHasStarted = false;
    if (!warningHasStarted) {
        timeWarningStarted = SimulationTime::Instance()->getSimulationTime();
        warningHasStarted = true;
    }
    ...
}

【讨论】:

  • 此答案假定警告应在程序执行开始附近显示一段固定时间,然后只要程序正在运行就不会再次显示。如果您想要不同的东西,则需要额外的逻辑来支持它。
  • 您好,谢谢您的回答。这是我尝试的第一件事......不幸的是它不起作用-因为updateHeader()函数被重复调用,每次调用它时,它都会完整运行-所以按照你的建议做,@987654325 @ 将在每次调用时设置为 false ......所以虽然它会在 if 中设置为 true,但一旦函数内的其余代码运行,它将回到开始并设置 warningHasStarted再次为 false - 意味着 if 中的代码将再次运行...
  • static 关键字防止warningHasStarted 的初始化发生多次。我过去曾使用过这种技术。注意static 关键字是绝对必要的;如果你把它排除在外,这项技术将不起作用。
  • 好的,所以我已经尝试了你的建议,但我现在遇到的问题是 timeWarningHasStarted 被赋予与我的时间变量相同的值稍后在函数 (currentSimuationTime) 中使用,尽管我使用相同的 getSimulationTime() 函数进行设置,因为该语句将在第一个语句之后执行,我希望它具有不同的值。但是,getSimulationTime() 的第二次使用似乎在第一次使用之后发生得太早,以至于返回的时间值之间存在显着差异......
  • 所以,等等,你是说currentSimulationTime = SimulationTime::Instance()-&gt;getSimulationTime(); 每次执行它时,在每次调用updateHeader() 时都会产生相同的currentSimulationTime 值?最后,某个时候在程序执行期间,您应该会看到分配给currentSimulationTime 的不同值。如果不是,那是你的问题:你的程序没有提前“模拟”时间。
猜你喜欢
  • 1970-01-01
  • 2016-07-30
  • 2011-07-02
  • 1970-01-01
  • 2020-11-20
  • 2014-09-10
  • 2015-07-27
  • 1970-01-01
  • 2020-01-28
相关资源
最近更新 更多