2013-08-20 3 views
0

주식 시장이 열려있을 때마다 5 분마다 실행되는 프로그램이 있습니다. 한 번 실행하면 다음 함수를 입력하고, 주식 시장이 있으면 5 분이 지나면 반환됩니다. 열다.시스템 시간 유형을 폴링하는 동안 설명 할 수없는 크래시

내가 이해하지 못하는 것은 보통 18 시간에서 19 시간 정도가 지나면 sigsegv 오류를 반환하는 것입니다. 나는 그것이 어떤 추억을 쓰지 않기 때문에, 왜 시스템 시간 유형에 대해 많이 알지 못하는데, 어쩌면 그게 그럴까?

어쨌든 당신이 줄 수있는 도움은 대단히 감사하겠습니다! 미리 감사드립니다 !! 당신이 "X 초 대기"를 할 경우

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

그런데 바쁜 대기는 정말 총체적입니다. 특히 한 번에 몇 분씩은 그렇습니다. (CPU 사용량은 100 %에 달하고 오랜 시간 동안 컴퓨터가 뜨거워 질 것입니다.) 대신 그 시간을 자고 싶다. –

+2

과열 CPU가 SEGV와 같은 무작위 결함 트랩을 생성하는 것은 전례가 없습니다. 특히 그것이 항상 SEGV이고 다른 어떤 것이 아닌 경우에 당신의 경우는 아닙니다. 반복적이고 일관성이 있다면, 과열은 가능성이 있지만, 덜 가능성있는 범인입니다 ... – twalberg

+2

다음 5 분 표시를 사용하면 100 % CPU 시간 대신 0 % CPU 시간을 사용하여 300 초 동안 잠자기 상태가되는'Sleep (300) '을 사용할 수 있습니다. 그러면 컴퓨터는 CPU를 사용하여 다른 유용한 작업을 수행 할 수 있습니다. 기다리고있어. 당신의 과정이 아니라 "우리는 아직 거기 있습니까?" 슈렉 (Shrek) 영화에서 동키 (Donkey)처럼. –

답변

2

, 다음 Windows 시스템 호출 Sleep(x)는 X의 밀리 초 동안 잠을 것입니다. 그러나 300 초 동안 잠을 자면, 3 초가 걸리는 작업 후에는 5 분마다 3 초씩 표류 할 것입니다. 중요하지 않을 수도 있지만, 같은 타이밍을 항상 유지하는 것이 중요하다면 [time 또는 그와 같은 기능을 기반으로] 다음 경계까지 걸리는 시간을 파악한 다음 그 수면을 잠자 게하십시오. [조금 일찍 실행 한 다음 다른 수표를 추가하고 일찍 일어 났을 때 잠을 잘 수 있습니다.] "5 분마다"가 대략적인 것이면 300 초가 좋습니다.

주어진 시간 동안 기다리는 다른 방법이 있지만 위의 내용이 충분하다고 생각됩니다.

0

반복 루프를 사용하는 대신 Sleep() 루프를 사용하는 대신 Waitable Timer을 대신 사용하는 것이 좋습니다. 그렇게하면 호출 스레드는 기다리는 동안 효과적으로 잠들 수 있으며 필요하다면 조기에 "깨우기"메커니즘을 제공합니다.

관련 문제