2013-08-20 2 views
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; 
} 
+2

Кстати, ожидание-ожидание действительно грубое, особенно за несколько минут за раз. (Использование вашего процессора будет стоить 100%, и ваш компьютер будет очень горячим в течение длительных периодов времени.) Вместо этого предпочитайте спать в это свободное время. –

+2

И это не совсем неслыханно для процессора с перегревом для генерации случайных ловушек ошибок, таких как SEGV. Однако не говорю, что это ваш случай, особенно если это всегда SEGV, а не что-то еще - если он повторяется/согласуется, то перегрев является менее вероятным виновником, хотя это все еще возможно ... – twalberg

+2

Если вы хотите подождать следующий 5-минутный знак, вы можете просто использовать «Сон (300)», который будет работать в течение 300 секунд, используя 0% процессорного времени вместо 100% -ного времени процессора - тогда ваш компьютер сможет делать другие полезные вещи с процессором, а он ждет. Вместо вашего процесса, говорящего: «Мы еще там?» как Ослик в фильме Шрека. –

ответ

2

Если вы хотите, чтобы «ждать Х секунд», то системный вызов Windows, Sleep(x) будет спать е миллисекунды. Обратите внимание, однако, если вы спите, скажем, 300, после некоторой операции, которая заняла 3 секунды, это означало бы, что вы дрейфуете 3 секунды каждые 5 минут - это может не иметь значения, но если важно, чтобы вы сохраняли одинаковые сроки все время, вы должен выяснить [на основе time или какой-либо такой функции], как долго это будет на следующую границу, а затем слить эту сумму [возможно, немного разрядиться, а затем добавить еще одну проверку и спящий режим, если вы проснулись раньше). Если «каждые пять минут» является более приблизительной вещью, то 300 штук в порядке.

Есть другие способы подождать определенное количество времени, но я подозреваю, что приведенное выше достаточно.

0

Вместо использования цикла занятости или даже Sleep() в цикле я бы предложил вместо этого использовать Waitable Timer. Таким образом, вызывающий поток может эффективно спать, пока он ждет, но при этом обеспечивает механизм «проснуться» раньше, если потребуется.

Смежные вопросы