2010-05-12 4 views
3

C++에서 피드 리더를 작성하려고하기 때문에 프로그램이 간헐적으로 새 피드를 확인해야합니다. 그러나 사용자는 여전히 프로그램과 상호 작용할 수 있어야하므로 시스템을 대기 상태로 유지하기 위해 찾은 제안이 나에게 도움이되지 않습니다. 누구든지 더 나은 솔루션을 제안 할 수 있습니까, 배경 또는 무언가에서 실행되는 타이머 말?C++에서 x 초마다 함수를 실행하십시오.

감사합니다, 찰스

+0

어떤 컴파일러를 사용하고 있습니까? – Jacob

+0

gcc를 사용하고 있습니다. 4.4.1 – wyatt

+3

배경 타이머만으로는 자르지 않습니다. 피드를 읽으려고하는 동안 프로그램이 제어 할 수있는 어떤 이유로 든 일부 네트워크 호출에서 시간 초과 될 수 있으며, 이는 프로그램이이 경우에도 멈출 수 있음을 의미합니다. 두 가지 문제를 올바르게 해결하려면 멀티 스레딩의 마법의 세계에 들어선 ... – Jon

답변

2

당신은 특정 기간 동안 휴면 스레드를 생성 할 수 있습니다. 이것은 OS 독립적입니다. 또는 윈도우에서 프로그래밍하는 경우 타이머가 주기적으로 타임 아웃 이벤트를 보내도록 설정할 수 있습니다. 타이머 사용은 배포 플랫폼에 따라 다릅니다.

+0

고마워, 나는 그것을 살펴볼 것이다. 나는 그것이 주관적이라는 것을 알고 있지만 단순히 스레드가 멈추는 것이 조금 지저분 해 보입니까? 아니면 이것이 완료된 것입니까? – wyatt

+0

스레드 멈춤은 사실 아주 좋습니다. 운영 체제는 "좋아요, 다음 x 초 동안은 사용하지 않을 것이며 그 동안 다른 작업을 예약 할 수 있습니다"라고 말할 수 있습니다. 대안은 끊임없이 돌아가고 끊임없이 체크하고있는 루프를 갖는 것입니다. 이 경우 운영 체제는 "일시 중지 된"스레드에 시간을 계속 할당합니다. 따라서 비효율적이다. – Smashery

+2

고정 된 일시 중지 시간이 1 초이고 작업을 완료하는 데 0.5 초가 걸리는 경우 1.5 초마다 실행됩니다. 작업을 수행하는 데 걸리는 시간을 고려해야 할 수 있습니다. – AshleysBrain

2

스레드를 사용해야합니다. 백그라운드에서 백그라운드에서 타이머를 수행하는 스레드와 포 그라운드에서 사용자와 상호 작용하는 스레드를 가지십시오. 그런 다음 특정 스레드를 호출하여 백그라운드 스레드가 수정할 수있는 스레드 사이에 공유 메모리 영역을 확보하십시오. 그리고 전경 하나 볼 수 있습니다. 아마도 부스트 스레드 라이브러리를 살펴보십시오. http://www.boost.org/doc/libs/1_43_0/doc/html/thread.html

1

UI와 피드 리더를 별도의 스레드로 설정하십시오. 사용자가 즉시 피드를 업데이트해야하는 작업을 수행하는 경우 피드 스레드를 중단합니다. 나에게

0

은 관찰자 디자인 패턴의 후보처럼 들린다 :

http://en.wikipedia.org/wiki/Observer_pattern#C.2B.2B

스폰 intermittantly 피드를 확인하고 다음 메인 클래스/콘크리트 observor 클래스의 handleEvent 메소드를 호출 스레드. 그렇게하면 주 수업이 대기 상태가되지 않습니다.

1

SIGALRM을 사용하면 n 초마다 간섭을받을 수 있습니다. 별도의 스레드가 필요 없습니다. 주 스레드는 신호 처리기를 입력합니다.

void sigtime(int signo) 
{ 
    signal(SIGALRM, sigtime); 
} 
.... 
signal(SIGALRM, sigtime); 
itimerval itm; 
itm.it_interval.tv_sec=0; 
itm.it_value.tv_sec = 0; 
itm.it_interval.tv_usec = 200000; 
itm.it_value.tv_usec = 200000; 
setitimer(ITIMER_REAL,&itm,0); 

이 물론 당신은

+0

+1 및 http://www.opengroup.org/onlinepubs/009695399/functions/getitimer.html 알람을 참조하십시오 http://www.opengroup.org/onlinepubs/009695399/functions/alarm.html 이는 for 간단한 정수 초 – Potatoswatter

0

나는 또한 함수마다 X 분 또는 몇 시간을 실행하는 프로그램을 만들고 싶어 나는 많은 예를 찾을 수 있지만, 유닉스와 같은 뭔가한다고 가정 그것, 그것을 만들에 대한 라이브러리를 포함하고 다운로드해야하고, 안락하지 않고, 논리가 아닌 내 자신을 만들었습니다.)) 아래에서 볼 수 있습니다.

#include <stdlib.h> 
#include <iostream> 
#include <time.h> 
using namespace std; 

struct tm *addtime(struct tm *tm2) 
{ 
     time_t t = time(0); // get time now 
    struct tm * tm1 = localtime(& t); 
    cout << " Time begin : " << tm1->tm_hour << " : " << tm1->tm_min <<endl; 
    struct tm * aux = (struct tm*)malloc(sizeof (struct tm)); 

    aux->tm_sec = tm1->tm_sec + tm2->tm_sec; 
    aux->tm_min = tm1->tm_min + tm2->tm_min + (aux->tm_sec/60) ; 
    aux->tm_hour = tm1->tm_hour + tm2->tm_hour + (aux->tm_min/60); 
    aux->tm_min %= 60; 
    aux->tm_sec %= 60; 
    return (aux); 

} 
bool verif_time(struct tm *tm1) 
{ 

    time_t t = time(0); // get time now 
    struct tm * now = localtime(& t); 
    if (tm1->tm_hour == now->tm_hour && tm1->tm_min == now->tm_min) 
     return true; 
    else 
     return false; 

} 

    int main() 
    { 
    struct tm * after = (struct tm*)malloc(sizeof (struct tm)); 

    after->tm_sec = 0; // here you can modify difference between now time and time when you want to execute function 
    after->tm_min = 1; 
    after->tm_hour = 0; 

    after = addtime(after); 
    cout << " After time" << after->tm_hour << ':' << after->tm_min<<endl; 
    while (true) 
    { 
     if (verif_time(after)) 
     { 
      cout << "Hello " << after->tm_hour << " : " << after->tm_min<<endl; //here you can include your function 

      after->tm_sec = 0; 
      after->tm_min = 1; 
      after->tm_hour = 0; // here also 

      after = addtime(after); 
      cout << " After time" << after->tm_hour << ':' << after->tm_min<<endl; 


     } 
    } 

    } 
관련 문제