C++ gtkmm通过stderr标准输出延迟输出

C++ gtkmm通过stderr标准输出延迟输出,c++,c++11,gtkmm,C++,C++11,Gtkmm,hy 我发现,gtkmm正在延迟我写入std::cerr/std::cout的输出,直到关闭Gtk::窗口 但经过一点研究,我发现,这并不总是正确的。例如,如果我向窗口添加一个按钮,并显示该按钮,则STDOUT和STDERR上的输出将作为exepcted工作 为了测试这一点,我编写了一个MWE:(如果您取消对行_button.show()的注释,您将看到,输出不会延迟。但是如果您不显示按钮,输出会延迟,直到窗口关闭。) 我还添加了一个ofstream,它将两种情况下的内容直接输出到/tmp/te

hy

我发现,gtkmm正在延迟我写入std::cerr/std::cout的输出,直到关闭Gtk::窗口

但经过一点研究,我发现,这并不总是正确的。例如,如果我向窗口添加一个按钮,并显示该按钮,则STDOUT和STDERR上的输出将作为exepcted工作

为了测试这一点,我编写了一个MWE:(如果您取消对行_button.show()的注释,您将看到,输出不会延迟。但是如果您不显示按钮,输出会延迟,直到窗口关闭。)

我还添加了一个ofstream,它将两种情况下的内容直接输出到/tmp/test

#include <gtkmm/window.h>
#include <gtkmm/button.h>
#include <gtkmm/application.h>
#include <fstream>
#include <iostream>

class window_t : public Gtk::Window {
public:
    window_t(void);

private:
    Gtk::Button _button;
};

window_t::window_t(void): _button("Click ME") {
    add(_button);
    //_button.show();
    std::cerr << "construct-cerr" << std::endl;
    std::cout << "construct-cout" << std::endl;
    std::cout.flush();
    std::cerr.flush();
    std::ofstream file("/tmp/test");
    file << "construct-file" << std::endl;
    file.close();
}

int main(int argc, char* argv[]) {
    auto app = Gtk::Application::create(argc, argv, "com.example.test");
    window_t gtkmm_window;
    return app->run(gtkmm_window);
}
为什么gtkmm延迟输出到STD(OUT | ERR),我如何防止这种情况


我使用的是gcc版本4.9.2和gtkmm 3.14。

在我的框中,您的程序输出到cerr,并在有行和无行
\u按钮的情况下显示()。程序按预期运行。对不起,我无法重现这个问题。嗯,您使用的是哪个版本的gtkmm和什么操作系统?我使用的是debian jessie.os:4.1.4-200.fc22.x86_64;g++(GCC)5.2.0;gtkmm 3.16.0;gtk+3.16.6在“我的盒子”上,您的程序输出到cerr,并在有或没有行
\u按钮的情况下输出。show()。程序按预期运行。对不起,我无法重现这个问题。嗯,您使用的是哪个版本的gtkmm和什么操作系统?我使用的是debian jessie.os:4.1.4-200.fc22.x86_64;g++(GCC)5.2.0;gtkmm 3.16.0;gtk+3.16.6
g++  main.cpp -o main `pkg-config --cflags --libs gtkmm-3.0`  -Wall -pedantic -Wextra -Werror -Wcast-qual -Wcast-align -Wconversion -fdiagnostics-color=auto -g -O2 -std=c++11