0

株式市場が開いているときに5分ごとに実行されるプログラムがあります.1回実行してから、次の関数を入力します。株式市場が開いている場合は5分経過すると戻ります。

私が理解していないのは、通常約 18 時間または 19 時間後にクラッシュして sigsegv エラーが返されることです。メモリに書き込んでいないので、理由はわかりません-systemtimeタイプについてはあまり知りませんが、それでいいのでしょうか?

とにかく、あなたが与えることができるどんな助けも大歓迎です!前もって感謝します!!

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]次の境界までの時間を把握し、その量をスリープ状態にする必要があります[おそらく少し短く実行してから、別のチェックを追加して、早起きした場合はスリープします]。「5 分ごと」がおおよその値である場合は、300 秒で問題ありません。

一定時間待つ方法は他にもありますが、上記で十分だと思います。

于 2013-08-20T21:59:50.103 に答える
0

ビジー ループを使用する代わりに、またはループ内であっても、 Waitable TimerSleep()を使用することをお勧めします。こうすることで、必要に応じて早期に「起動」するメカニズムを提供しながら、呼び出しスレッドは待機中に効果的にスリープすることができます。

于 2013-08-20T23:15:49.290 に答える