定时一次标志

时间:2017-04-04 15:56:57

标签: c++

我在this回答中看到,我们可以使用std::once_flag来调用一段代码:

std::once_flag onceFlag;

{
    ....
    std::call_once ( onceFlag, [ ]{ /* my code body here runs only once */ } );
    ....
}

标准中是否有类似timed_once_flag的内容会在一段时间后重置,因此可以再次调用这段代码?

timed_once_flag timedOnceFlag(5s);

{
    ....
    std::call_once ( timed_once_flag, [ ]{ /* called again after timeout */ } );
    ....
}

我搜索了这个,但我可能没有使用足够的搜索字词。

编辑:

为什么我需要这个:在我的情况下,我有多个线程可以向用户显示MessageBox,所以如果发生错误,它在所有线程中都是相同的(例如:连接错误)并且我希望应用程序能够只显示MessageBox一次,并且可能在将来再次显示一次。

1 个答案:

答案 0 :(得分:1)

onceFlag ,这是std::once_flag 的对象,此处是关键。

设置了std::once_flag对象的内部状态,因此不会再次执行std::call_once函数。

如果你注意到,这些标准只为std::once_flag类暴露了一个没有参数的构造函数,并且没有重载赋值运算符。标准可能已声明私有赋值运算符或使用“显式删除特殊成员函数。(C ++ 11)”。

据我所知,您无法更改/修改设置的内部状态。

尝试这种奇怪的方式,如果你真的需要......

声明不同的std::once_flag标志

std::once_flag flag1,flag2,flag3; //Three different flags.

    {
        ....
        std::call_once ( flag1, [ ]{ /* my code body here runs only once */ } ); //track first thread call
        std::call_once ( flag2, [ ]{ /* my code body here runs only once */ } ); //track second thread call
        std::call_once ( flag3, [ ]{ /* my code body here runs only once */ } ); //third third thread call

    }