0

我有一个程序,它在股市开市时每 5 分钟运行一次,它通过运行一次,然后进入以下函数,如果股市开市,它会在 5 分钟过去后返回。

我不明白的是,经过一段时间,通常是 18 或 19 小时后,它会崩溃并返回 sigsegv 错误。我不知道为什么,因为它没有写入任何内存 - 虽然我对系统时间类型不太了解,所以也许就是这样?

无论如何,您可以提供的任何帮助将不胜感激!提前致谢!!

void KillTimeUntilNextStockDataReleaseOnWeb()
{
    SYSTEMTIME tLocalTimeNow;

    cout<<"\n*****CHECKING IF RUN HAS JUST COMPLETED OR NOT*****\n";
    GetLocalTime(&tLocalTimeNow);//CHECK IF A RUN HAS JUST COMPLETED. IF SO, AWAIT NEXT 5 MINUTE MARK
    while((tLocalTimeNow.wMinute % 5)==0)
        GetLocalTime(&tLocalTimeNow);

    cout<<"\n*****AWAITING 5 MINUTE MARK TO UPDATE STOCK DATA*****\n";
    GetLocalTime(&tLocalTimeNow);//LOOP THROUGH THIS SECTION, CHECKING CURRENT TIME, UNTIL 5 MINUTE UPDATE. THEN PROCEED
    while((tLocalTimeNow.wMinute % 5)!=0)
        GetLocalTime(&tLocalTimeNow);

    cout<<"\n*****CHECKING IF MARKET IS OPEN*****\n";
        //CHECK IF STOCK MARKET IS EVEN OPEN. IF NOT, REPEAT
    GetLocalTime(&tLocalTimeNow);
    while((tLocalTimeNow.wHour < 8)||(tLocalTimeNow.wHour) > 17)
        GetLocalTime(&tLocalTimeNow);

    cout<<"\n*****PROGRAM CONTINUING*****\n";
    return;
}
4

2 回答 2

2

如果要“等待 X 秒”,则 Windows 系统调用Sleep(x)将休眠 x 毫秒。但是请注意,如果您在某些操作需要 3 秒后睡了 300 秒,这意味着您每 5 分钟漂移 3 秒 - 这可能无关紧要,但如果您始终保持相同的时间至关重要,那么您应该计算出[基于time或一些这样的函数]到下一个边界有多长时间,然后睡眠那个量[可能运行有点短,然后如果你早起就添加另一个检查和睡眠]。如果“每五分钟”更像是一个近似值,那么 300 秒就可以了。

还有其他方法可以等待给定的时间,但我怀疑以上方法就足够了。

于 2013-08-20T21:59:50.103 回答
0

我建议不要使用繁忙的循环,甚至Sleep()是循环,而是使用可等待计时器。这样,调用线程可以在等待时有效地休眠,同时在需要时仍提供一种提前“唤醒”的机制。

于 2013-08-20T23:15:49.290 回答