方法" DataOperation"必须返回DataResponse类型的值。
我的异步请求 - 回复中有一个回调函数" LoadDataReply"其中我在收到的回复中应用了一些业务逻辑并返回到main方法(我不确定返回回调是否正确)。
你们可以帮我解决如何返回LoadData方法调用者的值。
DataResponse DataOperation::LoadData(const RequestType request)
{
DataResponse dataResponse;
messageAssistant.AsyncRequest("LoadDataList", request)
.OnReply<MyResponseType>("LoadDataListReply", [this, &dataResponse](auto& reply) { dataResponse = this->LoadDataFromResponse(reply); });
return dataResponse;
}
DataResponse DataOperation::LoadDataFromResponse(const MyResponseType& reply)
{
///Doing some operation with reply data
DataResponse dataResponse;
dataResponse.Data = reply.Data();
return dataResponse;
}
上面的代码没有编译。
我收到编译错误,
error C4716: 'DataOperation::LoadData': must return a value
注意: - 我已更新了我的代码并正在编译而没有任何问题。但是我从LoadData返回的dataResponse对象没有在LoadDataFromResponse中更新值。它有初始值。
我如何确保它返回更新的值而不是初始值?
答案 0 :(得分:0)
使用处理程序。您可以创建Handler(每个线程都可以访问的消息列表)。看下面的pseodocode:
class Handler {
public:
Handler();
// Constructor
~Handler();
// Destructor
void pushmessage ( DataResponse* p );
DataResponse* popmessage();
bool empty();
protected:
vector<DataResponse*> pool;
RTTICriticalSection CS;
};
Handler::Handler()
{
CS = CreateCriticalSection;
}
Handler::~Handler()
{
DeleteCriticalSection(CS);
}
void Handler::pushmessage ( DataResponse* p )
{
EnterCriticalSection(CS);
try {
pool.push_back(p)
} catch(...){
//
}
LeaveCriticalSection(CS);
}
DataResponse* Handler::popmessage() {
DataResponse* dr = null;
EnterCriticalSection(CS);
try {
dr = pool.back();
pool.pop_back();
} catch(...){
//
}
LeaveCriticalSection(CS);
return dr;
}
bool Handler::empty() {
bool res = true;
EnterCriticalSection(CS);
try {
res = pool.empty();
} catch(...){
//
}
LeaveCriticalSection(CS);
return res;
}
DataResponse DataOperation::LoadData(const RequestType request)
{
messageAssistant.AsyncRequest("LoadDataList", request)
.OnReply<MyResponseType>("LoadDataListReply", [this](auto& reply) { this->LoadDataFromResponse(reply); });
}
/*DataResponse* */ void DataOperation::LoadDataFromResponse(const MyResponseType& reply)
{
///Doing some operation with reply data
DataResponse* dataResponse = new DataResponse();
dataResponse.Data = reply.Data();
handler.pushmessage( dataResponse );
//return dataResponse;
}
//call this sub somewhere inside the idle cycle synchronized with the main thread
void proceedMessages() {
while (!handler.empty())
{
DataResponse* dr = handler.popmessage();
//do something with dr
//free dr
}
}
答案 1 :(得分:0)
这已通过使用回调修复。