使用 c++11 中的新 std::async,我想我可能会尝试实现 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 的异步版本?
对上述代码的批评和任何其他评论也非常受欢迎。