문제

클래스 A와 개체 목록이 있습니다. a는 x 초마다 실행 해야하는 함수 f를 가지고 있습니다 (1 초마다 첫 번째 인스턴스의 경우, 5 초마다 1 초마다 1 초마다). 올바른 시간에 함수를 실행할 책임이있는 스케줄러 클래스가 있습니다. 내가 생각한 것은 인스턴스에 PTR을 유지하고 a :: f를 실행 해야하는 새로운 클래스 인 atime을 만드는 것입니다. 스케줄러는 Atime의 최소 우선 순위 대기열을 보유합니다.

  1. 그것이 올바른 구현이라고 생각하십니까?
  2. Atime은 스케줄러의 중첩 클래스 여야합니까?
도움이 되었습니까?

해결책

당신이 묘사 한 바에 따르면, 작동 할 수있는 것처럼 들립니다 :-)

IMHO 클래스 ATime 스케줄러가 A에 더 많이 속합니다. 스케줄러가 작업을 수행해야하며 A에게는 필요하지 않습니다. 사실, A (및 다른 세계)는 그 존재에 대해 알 필요조차 없습니다. 스케줄러의 개인 중첩 등급이 저에게 적합합니다.

다른 팁

이것은 너무 진보 될 수 있지만 여기에 간다 ...

부스트 :: 기능 그리고 부스트 :: 바인드 클래스 A에 대해 아무것도 알 필요가없는 스케줄러를 구현하는 데 사용할 수 있습니다. 이렇게하면 스케줄러를보다 일반적으로 재사용 할 수 있습니다.

다음은 귀하의 경우 부스트 시설을 어떻게 사용할 수 있는지를 보여주는 샘플 코드입니다.

#include <ctime>
#include <queue>
#include <boost/function.hpp>
#include <boost/bind.hpp>

struct Foo
{
    void onScheduler(time_t time) {/*...*/}
};

struct Bar
{
    void onScheduler(time_t time) {/*...*/}
};

typedef boost::function<void (time_t)> SchedulerHandler;

struct SchedulerEvent
{
    bool operator<(const SchedulerEvent& rhs) const {return when < rhs.when;}

    SchedulerHandler handler;
    time_t when;
};

class Scheduler
{
public:
    void schedule(SchedulerHandler handler, time_t when)
    {
        SchedulerEvent event = {handler, when};
        queue_.push(event);
    }

private:
    std::priority_queue<SchedulerEvent> queue_;
    void onNextEvent()
    {
        const SchedulerEvent& next = queue_.top();
        next.handler(next.when);
        queue_.pop();
    }
};

int main()
{
    Scheduler s;
    Foo f1, f2;
    Bar b1, b2;

    time_t now = time(0);
    s.schedule(boost::bind(&Foo::onScheduler, &f1, _1), now + 1);
    s.schedule(boost::bind(&Foo::onScheduler, &f2, _1), now + 2);
    s.schedule(boost::bind(&Bar::onScheduler, &b1, _1), now + 3);
    s.schedule(boost::bind(&Bar::onScheduler, &b2, _1), now + 4);

    // Do scheduling...

    return 0;
}

주목하십시오 Scheduler 아무것도 모릅니다 Foo & Bar, 그 반대. 모두 Scheduler 실제로 원하는 것은 "콜백"기능입니다. SchedulerHandler.

필요한 경우 SchedulerEvent 취소 할 수 있으려면 상황이 조금 복잡해집니다. boost::function 객체는 비교할 수 없습니다. 이 문제를 해결하려면 이벤트를 등록 할 때 일종의 "연결"토큰을 반환해야합니다. 이것은 본질적으로 부스트의 신호가하는 일입니다.

도움이 되었기를 바랍니다.

이 종류의 클래스는 스케줄러 클래스 내에 중첩 된 개인 구조물로 만들기 가장 좋으므로 스케줄러 클래스 내의 모든 필드에 쉽게 액세스 할 수 있습니다. (구조물의 모든 필드는 기본적으로 공개됩니다.)

두 번째 부분 (및 제목의 질문)에 관해서는, IMO는 완전히 맛의 문제입니다. 스케줄러 클래스의 정의에서 혼란을 줄이고 경고 이름 ( detail) 사람들이 그것을 사용하지 않도록합니다. 결국, 스케줄러에만 유용하다면 너무 많이 숨길 필요가 없습니다. 아무도 그것을 사용하고 싶지 않습니다.

아마도 C ++ 0x에서는 다를 수 있습니다 (나는 중첩과 부모 클래스 사이의 접근성 규칙을 어떻게 바꿀지 소문을 들었을 것입니다.

일반적으로 템플릿을 사용하고 아마도 Scheduler<A> (사용 사용 TimedOperation<A>) (또는 수많은 잠재적 개선/일반화)?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top