Command pattern problem

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • alexcpn

    #1

    Command pattern problem

    Hi I have a Command class of type

    class Command
    {
    T* m_objptr;
    void (T::*method)();

    :

    explicit Command(T* pObj,void (T::*p_method)( ),long timeout,const
    char* key,long priority = PRIO_NORMAL ):
    m_objptr(0),met hod(0),m_timeou t(timeout),m_ke y(key),m_value( priority)
    {
    m_objptr=pObj;
    method = p_method;
    }

    inline void execute()
    {
    (m_objptr->*method)();
    }
    //-----------------------------------------------------------------------

    I use this as

    cmd= new Command<CTask>( task1,&CTask::D oSomeTask,task1-
    >GetTimeOut()," ne2_11"PRIO_NOR MAL);
    where CTask is defined as

    class CTask
    {
    void DoSomeTask()

    Question 1
    Is this usage safe? ie will &CTask::DoSomeT ask point to the method
    of CTask ?

    I use this in a threadpool and I am sometimes getting thiings to work
    and sometimes access violation (VC6 compiler)

    Question 2
    Is it possible that I can pass a parameter to the method

    something like

    class Command
    {
    T* m_objptr;
    void (T::*method)(vo id *);


    class CTask
    {
    void DoSomeTask(void *) or
    static void DoSomeTask(void *)

    If so how do you initiate Command class - I was getting compiler error
    while doing this

    cmd= new Command<CTask>( task1,&CTask::D oSomeTask(this) ,task1-
    >GetTimeOut()," ne2_11"PRIO_NOR MAL);
    Thanks for your time
    Alex.C.P
  • Michael DOUBEZ

    #2
    Re: Command pattern problem

    alexcpn a écrit :
    Hi I have a Command class of type
    >
    class Command
    {
    T* m_objptr;
    void (T::*method)();
    >
    :
    >
    explicit Command(T* pObj,void (T::*p_method)( ),long timeout,const
    char* key,long priority = PRIO_NORMAL ):
    m_objptr(0),met hod(0),m_timeou t(timeout),m_ke y(key),m_value( priority)
    {
    m_objptr=pObj;
    method = p_method;
    }
    >
    inline void execute()
    {
    (m_objptr->*method)();
    }
    //-----------------------------------------------------------------------
    >
    I use this as
    >
    cmd= new Command<CTask>( task1,&CTask::D oSomeTask,task1-
    >GetTimeOut()," ne2_11"PRIO_NOR MAL);
    >
    where CTask is defined as
    >
    class CTask
    {
    void DoSomeTask()
    >
    Question 1
    Is this usage safe?
    It is not safe but it is legal.

    Your execute methode could be safer:
    inline void execute()
    {
    if( (m_objptr!=NULL ) && (method!=NULL)
    {
    (m_objptr->*method)();
    }
    //else do nothing, throw an exception ...
    }
    ie will &CTask::DoSomeT ask point to the method
    of CTask ?
    Yes.

    I use this in a threadpool and I am sometimes getting thiings to work
    and sometimes access violation (VC6 compiler)
    >
    Question 2
    Is it possible that I can pass a parameter to the method
    >
    something like
    >
    class Command
    {
    T* m_objptr;
    void (T::*method)(vo id *);
    >
    >
    class CTask
    {
    void DoSomeTask(void *) or
    static void DoSomeTask(void *)
    >
    If so how do you initiate Command class - I was getting compiler error
    while doing this
    >
    cmd= new Command<CTask>( task1,&CTask::D oSomeTask(this) ,task1-
    >GetTimeOut()," ne2_11"PRIO_NOR MAL);
    The types are not the sames: &CTask::DoSomeT ask is a void
    (CTask::*)(void *) when a void (CTask::*)(void *) is expected.

    You could use mem_fun structures for standard application but the
    easiest is to use boost::function type boost::function 0<void>.

    Michael

    Comment

    Working...