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());} );
だからここに私が聞きたい2つの質問があります:
- OutputDebugStringの非同期バージョンを実装するにはどうすればよいですか?
- OutputDebugStringの非同期バージョンを実装しようとさえすべきですか?
上記のコードに対する批判やその他のコメントも大歓迎です。