轮询系统时间类型时不明原因的崩溃

时间:2013-08-20 18:45:14

标签: c++ winapi

我有一个程序在股票市场开启时每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;
}

2 个答案:

答案 0 :(得分:2)

如果要“等待X秒”,则Windows系统调用Sleep(x)将休眠x毫秒。但是请注意,如果你睡了300秒,经过3秒的一些操作,这意味着你每隔5分钟漂移3秒 - 这可能无关紧要,但如果你一直保持相同的时间至关重要,那么你应该找出[基于time或某些此类函数]到下一个边界有多长时间,然后睡觉那个数量[可能会运行一点点然后再添加一个检查并在你早醒时睡觉]。如果“每五分钟”更接近一件事,那么300秒就可以了。

还有其他方法可以等待一段时间,但我怀疑上述情况已经足够了。

答案 1 :(得分:0)

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