문제
누군가가 콜백 함수를 사용하여 내 서버 응용 프로그램이 클라이언트에서 입력을 읽는 동안 백그라운드에서 실행되는 타이머를 구현하라고 제안했습니다.나는 온라인에서 설명을 찾아보았지만 누군가 나에게 더 간단한 비유를 해줄 수 있기를 바랐습니다.
감사해요.
해결책
Windows에서 콜백을 사용하여 타이머를 구현하는 방법에는 SetTimer와 timeSetEvent라는 두 가지 방법이 있습니다.기본 사항은 다음과 같습니다.
SetTimer는 콜백을 사용하더라도 메시지를 사용합니다(콜백 함수는 메시지 처리 결과로 호출됩니다).따라서 메시지 펌프를 실행하지 않으면 SetTimer를 실행할 수 없습니다.
콜백은 땅에 있는 구멍에서 C++ "this" 포인터를 알지 못하는 운영 체제에 의해 호출되므로 콜백은 전역 C 스타일 함수이거나 정적 멤버여야 합니다.
timeSetEvent는 "멀티미디어" 타이머 제품군의 일부이며 메시지 펌프가 필요하지 않습니다.하지만 위의 콜백 함수 서명에 대한 관찰 내용은 여전히 적용됩니다.하지만 콘솔 앱을 작성하는 경우에는 메시지 펌프에 대한 요구 사항이 없다는 점이 중요할 수 있습니다.
스레딩 및 CreateWaitableTimer를 고려할 수도 있지만 저는 대기 가능 타이머를 자주 사용하지 않으므로 이에 대해 언급할 수 없습니다.
백그라운드에서 작업을 수행해야 하는 경우 스레딩은 문제를 해결하는 훨씬 더 우아한 방법이 될 수 있습니다.스레딩을 할 때 작업을 여러 개의 덩어리로 나눌 필요가 없습니다(타이머에서 작업을 시작하는 경우에는 이렇게 합니다).그러나 물론 스레드는 GUI를 건드릴 수 없으므로 인생은 작은 스레딩을 시작할 때 복잡합니다.내 웹사이트에 작업자 스레드에 대한 소개가 있습니다. 여기.
다른 팁
유추?
콜백 기능에 대한 간단한 설명을 보려면 여기를 살펴보십시오.
C의 "콜백"이란 무엇이며 어떻게 구현됩니까?
콜백이있는 타이머를 사용하면 '초의 호출 기능 X마다'라는 말이 있고 멀티 태스킹을 지원하는 시스템을 사용하면 원래 함수가 수행 할 수있는 일에 관계없이 두 번째 실행 스레드에서 y 초마다 그 함수가 호출됩니다.
편집 : 다른 답변에서 제안 된 바와 같이, 시스템은 두 번째 스레드를 만들지 않을 수 있으며,이 경우 스레드를 직접 만들고 해당 스레드에서 콜백을 설정해야합니다.
편집 : Windows에서는 사용할 수 있습니다 Settimer 기능. WM_TIMER 메시지를 Window의 메시지 큐에 게시합니다.이 메시지는 메시지 루프가 직접 처리하거나 기본 메시지 절차로 넘어 가서 지정한 콜백 기능을 호출 할 수 있습니다. 창문이 없다면 어떻게되는지 잘 모르겠지만 시도해보십시오.
귀하의 질문은 상당히 불분명하지만, 해당 스레드에서 스레드를 만들고 기능을 실행한다고 제안했을 가능성이 있습니다.
이것은 시스템 별을 서브 클래싱하여 수행 할 수 있습니다 Thread
수업; 인수로서 일종의 콜백 함수로 동일한 클래스를 구성함으로써; 시간 제한 후 콜백 함수를 호출하는 타이머를 만들어 ...보다 구체적인 질문 없이는 더 구체적인 조언을 할 수 없습니다.