将2个指针提取为(void *)

时间:2011-10-07 15:23:29

标签: c++ function pointers casting

我正在尝试将2个指针作为另一个函数类型转换的参数传递给(void *) 如何在最终功能中分离这两个?

示例:

  class Backgrounder{
        public:
            MESSAGE_QUEUE* m_pMsgQueue;
            LockSection* m_pLc;
            static void __cdecl Run( void* args){

                MESSAGE_QUEUE* s_pMsgQueue = (MESSAGE_QUEUE*)args[0]; // doesn't work
                LockSection* s_pLc = (LockSection*)args[1]; // doesn't work

            }
            Backgrounder(MESSAGE_QUEUE* pMsgQueue,LockSection* pLc) { 
                m_pMsgQueue = pMsgQueue; 
                m_pLc = pLc;
                 _beginthread(Run,0,(void*)(m_pMsgQueue,m_pLc)); 
            }
            ~Backgrounder(){ }
        };

3 个答案:

答案 0 :(得分:3)

您应该创建一个struct,将这两个指针类型作为成员,并将指针传递给它。

答案 1 :(得分:2)

表达式(m_pMsgQueue,m_pLc)不符合您的想法;它调用逗号运算符,它只是计算第二个参数。

将参数捆绑到一个结构中并传递它。

答案 2 :(得分:1)

您可以将它们包装在一个结构中,并将指针传递给该结构。但要小心,因为该结构应 not Backgrounder构造函数的本地声明 - 这将导致未定义的行为,因为线程可能仍然在启动它的函数终止后运行。它应该是动态分配的,static类成员或全局变量。

实际上,我会传递this指针,因为您基本上希望能够访问Run函数中对象的字段:

class Backgrounder{
    public:
        MESSAGE_QUEUE* m_pMsgQueue;
        LockSection* m_pLc;

        static void __cdecl Run (void *pThis) {
            MESSAGE_QUEUE* s_pMsgQueue = ((Backgrounder *) pThis)->m_pMsgQueue;
            LockSection* s_pLc = ((Backgrounder *) pThis)->m_pLc;
        }

        Backgrounder(MESSAGE_QUEUE* pMsgQueue,LockSection* pLc) { 
            m_pMsgQueue = pMsgQueue; 
            m_pLc = pLc;
            _beginthread(Run, 0, (void *) this); 
        }
        ~Backgrounder(){ }
    };

当然,您需要确保新创建的Backgrounder对象不会过早销毁,也就是说,线程应该在销毁之前完成。

此外,如果稍后从父线程修改这些字段,则需要使用适当的同步机制。