dk1*_*123 3 c++ asynchronous c++11
使用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");
}
}
Run Code Online (Sandbox Code Playgroud)
以及我对非同步版本的非常小的尝试(不起作用):
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");
}
});
}
Run Code Online (Sandbox Code Playgroud)
由于上述方法不起作用,我现在开始认为异步调用OutputDebugStringN可能比尝试在函数内部启动异步作业更好(这很有用,但很麻烦):
auto dstring = std::async([]{ OutputDebugStringN("[NovelScript::ParseTokens] searched bookmark: \"%s\" does not exist\n", bookmark.c_str());} );
Run Code Online (Sandbox Code Playgroud)
所以这里有两个我想问的问题:
对上述代码和任何其他评论的批评也非常受欢迎.
我认为你应该为你的消息设置一个队列,而不是每次调用你的函数都启动一个线程,这样你的消息就会以正确的顺序输出干净.
因此,您的函数OutputDebugStringN(const char *format, ... )将创建消息字符串,然后对单独的打印输出线程读取的字符串进行排队.该线程会调用OutputDebugString.
这是一个例子 - 虽然不完整,但是不应该修改错误处理和print_from_queue直到某些终止条件运行并且对CPU更加友好.
std::mutex g_m;
std::deque<std::string> que;
std::atomic<bool> endcond = false;
void queue(std::string msg)
{
std::lock_guard<mutex> _(g_m);
que.push_back(msg);
}
void print_from_queue()
{
while ( !endcond )
{
if ( que.size() )
{
std::lock_guard<mutex> _(g_m);
std::string msg = que.front();
que.pop_front();
OutputDebugStringA(msg.c_str());
}
}
}
int debugf( const char *format,... )
{
std::vector<char> line(256);
va_list args;
va_start( args, format );
int len = vsprintf_s( &line[0], line.size(), format, args );
va_end( args );
queue( &line[0] );
return len;
}
int _tmain(int argc, _TCHAR* argv[])
{
auto thr = std::async( std::launch::async, print_from_queue );
debugf("message1");
debugf("message2");
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1349 次 |
| 最近记录: |