C异步OutputDebugString

C异步OutputDebugString,第1张

概述使用c 11中的新std :: async,我想我可能会尝试实现OutputDebugString的异步版本,以免我通过通常的OutputDebugString函数通常对每个小细节进行大量打印而导致性能降低. . 所以这是我原来的同步OutputDebugString实现(可行): static void OutputDebugStringN(const char *format, ...){ 使用c 11中的新std :: async,我想我可能会尝试实现OutputDeBUGString的异步版本,以免我通过通常的OutputDeBUGString函数通常对每个小细节进行大量打印而导致性能降低. .

所以这是我原来的同步OutputDeBUGString实现(可行):

static voID OutputDeBUGStringN(const char *format,...){    char outstring[256];    memset(outstring,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,sizeof(outstring));        try        {            va_List args = {0};            va_start(args,format); //args = (va_List) (&format+1);            vsprintf_s(outstring,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的异步版本?

对上述代码和任何其他评论的批评也非常受欢迎.

解决方法 我认为你应该为你的消息设置一个队列,而不是每次调用你的函数都启动一个线程,这样你的消息将以正确的顺序输出干净.

所以你的功能例如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(),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");...
总结

以上是内存溢出为你收集整理的C异步OutputDebugString全部内容,希望文章能够帮你解决C异步OutputDebugString所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1219846.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存