【发布时间】:2013-01-26 20:09:10
【问题描述】:
使用 c++11 中的新 std::async,我想我可能会尝试实现 OutputDebugString 的异步版本,以摆脱由于我通常大量打印每个小细节而导致的一些性能下降通过通常的 OutputDebugString 函数。
所以这是我原来的同步 OutputDebugString 实现(有效):
static void OutputDebugStringN(const char *format, ...)
{
char outstring[256];
memset(outstring, 0, sizeof(outstring));
try
{
va_list args = {0};
va_start(args, format); //args = (va_list) (&format+1);
vsprintf_s(outstring, format, args);
va_end(args);
OutputDebugString(outstring);
}
catch (...) //most likely reference val arg error (va_list doesn't support ref args)
{
OutputDebugString("[OutputDebugStringN] Something went wrong\n");
}
}
以下是我非常天真地尝试异步版本(不起作用):
static void OutputDebugStringN(const char *format, ...)
{
auto future = std::async([]{
char outstring[256];
memset(outstring, 0, sizeof(outstring));
try
{
va_list args = {0};
va_start(args, format); //args = (va_list) (&format+1);
vsprintf_s(outstring, format, args);
va_end(args);
OutputDebugString(outstring);
}
catch (...) //most likely reference val arg error (va_list doesn't support ref args)
{
OutputDebugString("[OutputDebugStringN] Something went wrong\n");
}
});
}
由于上述方法不起作用,我现在开始认为异步调用 OutputDebugStringN 可能比尝试在函数本身内部启动异步作业更好(这有效,但是麻烦):
auto dstring = std::async([]{ OutputDebugStringN("[NovelScript::ParseTokens] searched bookmark: \"%s\" does not exist\n", bookmark.c_str());} );
所以我想问两个问题:
- 我应该如何实现 OutputDebugString 的异步版本?
- 我是否应该尝试实现 OutputDebugString 的异步版本?
也欢迎对上述代码和任何其他 cmets 提出批评。
【问题讨论】:
-
您是否尝试使用 std::async?我的问题当然是它只在后来的 c++ 中,所以它并不总是可用的。您可以通过构建自己的生产者-消费者队列和自己的线程来实际发送消息来实现异步。您在上面使用 async 是不正确的。它不会给你你想要的行为。
-
@thang 这只是我的一个小型个人项目,所以我并不介意它只是 c++11 的一部分。虽然我对异步实现并不是很熟悉(正如您已经看到的那样) - 如果有机会,您将如何实现它?
-
我会写一个很长的回复..需要比评论中分配的更多空间
-
@thang 谢谢大家的帮助。非常感谢。
-
将
outstring更改为char outstring[256] = { };,你不需要那个memset废话。 ;-]
标签: c++ asynchronous c++11