2012-12-23 9 views
2

Visual Studio 2012와 C++을 사용하고 있으며 5 분마다 함수를 호출해야합니다.하지만 그 일을 처리했지만 CPU의 25 %를 소비합니다. 그것은 이상과는 거리가 멀다. 다음과 같이C++의 메소드가 일정한 시간마다 함수를 호출하는 방법

코드는

time_t start; 
time_t end; 
time(&start); 
while (1) { 
time(&end); 
double dif = difftime (end,start); 
if (dif >= 300) { autofunction(); time(&start);} else {} } 

함수 매 5 분 내 while 루프를 늦출 수있는 방법을 호출에 대해 갈 수있는 더 많은 CPU 효율적인 방법이있다?

모든 안내가 크게 감사하겠습니다.

+2

'절전'기능을 사용할 수 있습니다. –

+0

나는 다른 일을 동시에하고 싶기 때문에 잠을 자고 싶지 않다고 언급했다. – Ryan

+0

@ user1661022 if 문에서 else 부분에 다른 작업을 수행합니까? – wimh

답변

2

Windows에는 Sleep()이 있으며 300 초마다 발생하는 문제에 대해서는 완벽하게 좋습니다. 또한 잠재적으로 timerproc 인수를 취하는 Windows에 타이머가 있습니다 (함수입니다). C++이 아닌 C 함수이므로 정적 멤버가 아니면 클래스 멤버 함수가 아니어야합니다.

+0

음, 나는 거기에 람다 또는'std :: bind'를 전달하는 것이 완벽하다고 생각합니다. –

+0

예, 멤버 함수가 아닌 한 "함수로 직접 호출 할 수있는"것은 아무 문제가 없습니다. 콜백 함수를 사용하여 모든 제한 사항과 트릭에 대한 에세이를 작성하고 싶지는 않지만 적어도 존재한다는 것을 언급하십시오. –

0

당신이하는 일은 busy waiting입니다. 경과 된 시간을 지속적으로 확인하여 CPU 시간을 소모하십시오.

Windows를 사용 중이므로 Using Timer Queues에 관심이있을 수 있습니다.

이렇게하면 콜백 함수가있는 타이머가 만들어집니다. 타이머가 만료 될 때까지 기다리는 동안 다른 작업을 수행 할 수 있습니다.

1

아무도 제안하지 않았으므로 새로운 std::threadSleep을 생성 할 수 있습니다.

0

저는 최선의 해결책은 여러분이하는 일에 대한 세부 사항에 달려 있다고 생각합니다. 약 5 분이 필요하면 어쩌면 더 오래 걸리는 계산을 프로그래밍 방식으로 편리한 위치에 놓을 수 있으며, 확인한 후 5 분 후에 처음으로 작업을 실행하게됩니다.

그렇지 않으면 @BartekBanachewicz가 sleep을 사용하는 스레드 시작에 대한 가장 좋은 제안을 가지고있는 것처럼 보입니다. 주 스레드가 확실히 5 분 이상 실행되고있는 한, 항상 스레드를 다시 또는 0-스레드를 다시 시작하는 것이 좋습니다.

스레드를 사용하면 특정 창을 필요로하지 않는 이점이 있습니다. Timer Queues가 무엇이든 @ OlafDietsche의 제안. C++ 0x를 사용하면 스레드를 매우 쉽게 사용할 수 있습니다 (http://en.cppreference.com/w/cpp/thread/thread 참조). http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-1-starting-threads.html