我正在尝试将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(){ }
};
答案 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
对象不会过早销毁,也就是说,线程应该在销毁之前完成。
此外,如果稍后从父线程修改这些字段,则需要使用适当的同步机制。