gpt4 book ai didi

c++ - 抽象基类 C++ 中的静态回调

转载 作者:太空宇宙 更新时间:2023-11-04 11:57:02 24 4
gpt4 key购买 nike

我遇到了一个 OOP/设计问题,我非常希望有人可以引导我朝着不需要完全重写的方向前进。

该系统是必不可少的 Windows 服务,它具有约 9 个负责特定任务的辅助线程。所有线程共享一些共同的功能(例如,在内部发送和接收消息的能力等)。因此,我定义了一个抽象基类,所有线程都从中继承。

但是,其中四个线程还使用基于第 3 方 IPC 系统(madshi 的 CreateIpcQueue)的进程间通信系统。为了避免在这四个线程中复制所有相同的代码,我定义了一个额外的类来支持这一点:

TThread <-TBaseThread<-TIPCBaseThread<- Four IPC threads
^- All other threads.

IPC 系统的机制是您定义一个回调函数,然后调用 CreateIpcQueue 将此回调传递给它。在我的 TIPCBaseThread 中,我松散地做了这样的事情:

// TIPCBaseThread.h
class TIPCBaseThread : public TBaseThread
{
private:
static TIPCBaseThrd *pThis;
// defines the callback to use with the IPC queue
static void CALLBACK IPCQueue(char *cName, void *pMsgBuf, unsigned int iMsgLen,
void *pRtnBuf, unsigned int iRtnLen);
protected:
// virtual method, to be defined in derived classes, to handle IPC message
virtual void ProcessIPCMsg(char *cName, void *pMsgBuf, unsigned int iMsgLen, void *pRtnBuf,
unsigned int iRtnLen) = 0;
public:
CRITICAL_SECTION csIPCCritSect;


// TIPCBaseThread.cpp
TIPCBaseThrd* TIPCBaseThrd::pThis = 0;

__fastcall TIPCBaseThread::TIPCBaseThread(…) : TBaseThread(…)
{
pThis = this;
InitializeCriticalSectionAndSpinCount(&csIPCCritSect, 1000);
CreateIpcQueueEx(“SomeQueueName”, IPCQueue, 1, 0x1000);
//^Callback Queue

}

void CALLBACK TIPCBaseThread::IPCQueue(char *cName, void *pMsgBuf, unsigned int iMsgLen,
void *pRtnBuf, unsigned int iRtnLen)
{
EnterCriticalSection(&pThis->csIPCCritSect);
pThis->ProcessIPCMsg(cName, pMsgBuf, iMsgLen, pRtnBuf, iRtnLen);
LeaveCriticalSection(&pThis->csIPCCritSect);
}

我的一般想法是 TIPCBaseThread 会有效地负责创建和管理 IPC channel ,然后在各种派生类中调用 ProcessIPCMsg()。

现在,当我测试系统并向任何 IPC channel 发送消息时,消息在 TIPCBaseThread 回调中被接收但被传递到最后一个派生类(将被创建),而不是应该接收的类它。我假设这与

[static TIPCBaseThrd *pThis] 

属性在每个派生类被实例化时被覆盖(但我承认我不是 100% 确定)?

有人可以在这里引导我朝着正确的方向前进吗?显然我想知道到底是什么导致了这个问题,但理想情况下我想知道是否有一种解决方法可以避免完全重写整个对象继承——显然在幕后还有更多的事情要做比我展示的要多,如果我必须完全放弃这个设计,我将遇到严重的问题。

非常感谢,

迈克柯林斯

最佳答案

我认为你应该更改回调以将实例作为参数

static void CALLBACK IPCQueue(TIPCBaseThread *instance, 
char *cName, void *pMsgBuf, unsigned int iMsgLen,
void *pRtnBuf, unsigned int iRtnLen);

...

void CALLBACK TIPCBaseThread::IPCQueue(char *cName, void *pMsgBuf, unsigned int iMsgLen, 
void *pRtnBuf, unsigned int iRtnLen)

{
...
instance->ProcessIPCMsg(cName, pMsgBuf, iMsgLen, pRtnBuf, iRtnLen);
...
}

关于c++ - 抽象基类 C++ 中的静态回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15808115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com