Application::and() 与 With Server::post 结合使用
Posted
技术标签:
【中文标题】Application::and() 与 With Server::post 结合使用【英文标题】:WApplication::bind() usage in combination with Wt::WServer::post 【发布时间】:2015-09-22 13:36:51 【问题描述】:我想绑定一个回调,它将由 Wt 事件循环之外的线程调用。 所以很明显我想使用 Wt::WServer::post,但我不明白应该如何使用 WApplication::bind,因为它是一个非静态函数。 第一次尝试是这样的:
auto loaded_callback = [](const decltype(Wt::WApplication::sessionId) &session)
Wt::WServer::post(session,
Wt::WApplication::bind(&table_model::member_func),)
;
这当然不起作用,因为bind
是非静态的。但是我的下一次尝试
auto object_protect_bind =
Wt::WApplication::instance()->bind(&order_aggregate_table_model::load_future_in_map);
由于大量编译器错误而失败
错误 153 错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int \boost\function\function_template.hpp 922 1 MDDB_Web 错误 156 错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int \boost\function\function_template.hpp 926 1 MDDB_Web 错误 160 错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int \boost\function\function_template.hpp 927 1 MDDB_Web 错误 150 错误 C2903:“应用”:符号既不是类模板也不是函数模板 \boost\function\function_template.hpp 922 1 MDDB_Web 错误 162 错误 C2825:“manager_type”:后跟“::”时必须是类或命名空间 \boost\function\function_template.hpp 934 1 MDDB_Web 错误 154 错误 C2653:'handler_type':不是类或命名空间名称 \boost\function\function_template.hpp 926 1 MDDB_Web 错误 158 错误 C2653:'handler_type':不是类或命名空间名称 \boost\function\function_template.hpp 927 1 MDDB_Web 错误 164 错误 C2275:'manager_type':非法使用此类型作为表达式 \boost\function\function_template.hpp 934 1 MDDB_Web 错误 165 错误 C2146:语法错误:在标识符“管理”\boost\function\function_template.hpp 934 1 MDDB_Web 之前缺少“” 错误 159 错误 C2146:语法错误:缺少 ';'在标识符“manager_type”\boost\function\function_template.hpp 927 1 MDDB_Web 之前 错误 155 错误 C2146:语法错误:缺少 ';'在标识符 'invoker_type' \boost\function\function_template.hpp 926 1 MDDB_Web 之前 错误 152 错误 C2143:语法错误:缺少 ';'在'
而我想到的整体解决方案是:
auto sessionId = Wt::WApplication::instance()->sessionId();
auto server_ptr = Wt::WServer::instance();
auto object_protect_bind = Wt::WApplication::instance()->bind(&order_aggregate_table_model::load_future_in_map);
auto inner_bind = std::bind(object_protect_bind, this);
auto loaded_callback = []
(Wt::WServer* server,
const std::string &session,
boost::function<void()> widget_bind)
-> void
server->post(session, widget_bind, boost::function<void()>());
;
this->data_future =
std::async(std::launch::async,
table_model::load_quiet_a_bunch_of_data,
query, database, std::bind(loaded_callback, server_ptr, sessionId, inner_bind));
Wt::WTimer::singleShot(20 * 1000, this, &table_model::load_future_in_map);
有什么建议吗?
【问题讨论】:
【参考方案1】:感谢Koen Deforche in the official forum,问题是:
Wt::WApplication::bind
应该采用已经绑定的方法,而不是方法本身。
在使用 lambda 时,还有一个令人惊讶的(至少对我而言)模板细节,所以为了举例,我的数据加载线程使用的回调解决方案是:
static std::map<decltype(views::measurements_grouped_by_orders::order_number),
order_value>
order_aggregate_table_model::async_load_order_values(
const odb::query<views::measurements_grouped_by_orders> &query,
std::shared_ptr<odb::database> mddb,
std::function<void(void)> callback) ...
if (callback) callback();
return map;
void order_aggregate_table_model::get_data(const odb::query<views::measurements_grouped_by_orders> &query)
auto sessionId = Wt::WApplication::instance()->sessionId();
auto server_ptr = Wt::WServer::instance();
auto object_protect_bind =
Wt::WApplication::instance()->bind(/*Wt::WApplication::bind
handles the case that
the widget might already been destroyed*/
std::bind(&order_aggregate_table_model::load_future_in_map,this));
auto loaded_callback = []
(Wt::WServer* server,
const std::string &session,
std::function<void()> widget_bind)
-> void
server->post(session, widget_bind, boost::function<void()>());
//Wt::Server::post handles the case when the session is already been destroyed
;
std::function<void()> final_callback = //Because of template quirks had to stick the type
std::bind(loaded_callback, server_ptr, sessionId, object_protect_bind);
this->order_aggregate_map_future =
std::async(std::launch::async,
order_aggregate_table_model::async_load_order_values,
query, this->mddb, final_callback);
Wt::WTimer::singleShot(30 * 1000, this,
&order_aggregate_table_model::load_future_in_map); //For the case that the async loader crashed
【讨论】:
以上是关于Application::and() 与 With Server::post 结合使用的主要内容,如果未能解决你的问题,请参考以下文章
DESCRIBE:When you mouse click right-side is open an application and click left-side is attribution.
如何将特定的 SQL 语句实现为 SQLAlchemy ORM 查询
How can i fix Application' 是 'System.Windows.Application' 和 'System.Windows.Forms.Application' 之间的模糊