我使用C++创建了一个win32控制台应用程序。我使用了一些API(不是我的,我不能修改它的源代码)。它的写法是,它将一些信息写到控制台屏幕上,而不是每次我调用它时(每秒48次)所以我想把它放到某个线程中并限制它的输出能力,但是我需要得到当该线程将尝试输出一些对我来说很重要的消息时通知。我有标准字符串中的消息文本。如何使用boost在C++中做这样的事情?Boost:如何创建一个线程,以便您可以控制其所有标准输出,标准错误?
回答
该功能在Boost中不存在。你可以,但是,使用_dup2
来代替标准输出描述:
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <io.h>
#include <iostream>
#include <windows.h>
int main()
{
HANDLE h = CreateFile(TEXT("test.txt"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (0 == SetStdHandle(STD_OUTPUT_HANDLE, h)) {
std::fprintf(stderr, "`SetStdHandle` failed with error %d\n", (int)GetLastError());
return EXIT_FAILURE;
}
int h_desc = _open_osfhandle((long)h, 0);
_dup2(h_desc, STDOUT_FILENO);
std::printf("test\r\n"); // This actually writes to `h`.
std::fflush(stdout);
std::cout << "another test" << std::endl; // Also writes to `h`
CloseHandle(h);
return EXIT_SUCCESS;
}
本质上讲这招的确是让你所有的写操作重定向到stdout
,std::cout
和GetStdHandle(STD_OUTPUT_HANDLE)
到您选择的一个可写的句柄(h
) 。当然,您可以使用CreatePipe
来创建可写句柄(h
)并从另一个线程的可读端读取。
编辑:如果你正在寻找一个跨平台解决方案,请注意,这一招是POSIX兼容的系统更容易,因为dup2
是unistd.h
的标准功能和“可写的处理”都已经描述符。
我不能想出一种方法来实现提升你想要的东西,因为描述了问题。
但是,这个API行为非常令人困惑。向控制台吐出大量输出是有点反社会的。您是否使用API库的Debug版本?您确定没有办法配置API,以便将此数据输出到不同的流,以便您可以在不捕获整个标准输出的情况下对其进行过滤?有没有办法减少输出量,这样你只能看到你关心的重要事件?
如果您确实需要捕获标准输出并对某些感兴趣的字符串(事件)执行操作,那么Win32提供了这样做的方法,但我真的很想看看是否可以修改此输出来满足您的要求在诉诸这些之前需要。
这里有一个疯狂的想法:如果LIB使用COUT/CERR
,你可以用自己的实现来替代这些全局变量的流缓冲。它将在flush/data上检查一些线程局部变量,以查看数据是否来自调用该库的线程,然后将其路由到其他地方(即转换为std :: string/std :: ostringstream)而不是常规的cout/cerr streambufs。 (你应该保持在这个范围内。)
如果它使用c的stdout/stderr,我认为这样做很难做到正确,但它仍然可行。您需要创建一些管道并来回路由。更多的是C/unixy问题,那我现在还不太了解......。 :)
希望它有帮助。
- 1. 从Jython控制标准输出/标准错误
- 2. 如何如果标准输出没有活动/标准错误
- 3. Python3:线程安全机制重定向标准输入,标准输出,标准错误
- 4. 暂时路线标准输出/标准错误安慰
- 5. 保存标准输出,标准错误和标准输出+标准错误同步
- 6. 是否有可能输出到监视流而不是标准输入,标准输出和标准错误? (python)
- 7. 线程池可以重用一个标准线程吗?
- 8. 将父进程的控制台(标准输出,标准错误等)输出重定向到子进程(反向)
- 9. Rail3 |如何为所有控制器创建标准路线/动作?
- 10. 打开Windows控制台的标准输入/标准输出/标准输入/输出为win32和win64在C
- 11. Python:如何将二进制数据写入标准输出以便bash脚本可以使用进程替换?
- 12. 标准控制台输入
- 13. 是否有可能重定向输入/输出从fd其他然后标准输入,标准输出,标准错误
- 14. 标准错误重定向到标准输出
- 15. bash脚本不捕获标准输出,只是标准错误
- 16. 捕获标准错误和标准输出的好方法
- 17. Java:同步标准输出和标准错误
- 18. 关于标准输出/标准错误重定向
- 19. 检查标准输出或标准错误
- 20. 在Perl中处理Java标准输出和标准错误
- 21. Python traceback.print_exc()打印到标准输出或标准错误吗?
- 22. 从C#重定向原生dll标准输出/标准错误#
- 23. 在Chrome中,我怎样才能得到JavaScript控制台输出到标准输出/标准错误
- 24. 获取派生进程的标准输出/标准错误在子进程
- 25. 标准输出pymssql可变
- 26. 打开一个非标准的网址,以便在Cocoa程序
- 27. 发送JVM -verbose输出到标准错误而不是标准输出
- 28. 可能得到所有输出到一个脚本标准输出?
- 29. 使用Ruby的记录器有错误转到标准错误,但其他消息到文件/标准输出?
- 30. 如何在可以为空的字段上创建标准?