在线程和我的主要文件之间共享文件

时间:2014-07-03 07:57:56

标签: c++ c++11 fstream

我有一个文件,我想在main中声明,但在线程中修改。

我在我的MainWindow标头文件std::ofstream file;中声明。

然后我尝试将MainWindow.cpp的构造函数初始化为file("test.txt", std::ios::out | std::ios::trunc);

线程中的函数是静态的:

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);

        // Constructs the new thread and runs it. Does not block execution.

        ref_bool_Server = true;
        fichier ("test.txt", std::ios::out | std::ios::trunc);
        m_t1 = std::thread(lancerServeur, std::ref(ref_bool_Server), std::ref(lancerEnregistrement));

        // Je sauvegarde ma main window
        m_psMainWindow = this;

    }

    MainWindow::~MainWindow()
    {
        delete ui;
        ref_bool_Server = false;
        m_t1.join();
    }


        void MainWindow::lancerServeur(std::atomic<bool>& boolServer, std::atomic<bool>& lancerEnregistrement){
            serveur s;//J'instancie un serveur
            StructureSupervision::T_StructureSupervision* bufferStructureRecu;
        while(boolServer){
            bufferStructureRecu = s.receiveDataUDP();
            if(bufferStructureRecu != NULL){
               m_psMainWindow->emit_signal_TrameRecu( bufferStructureRecu );
            }
            if(lancerEnregistrement){
                fichier << bufferStructureRecu->SystemData._statutGroundFlight;
            }
        }

    }

ofstream的de claration是假的(可能是synthaxic),我不知道如何在静态函数中使用这个文件。

1 个答案:

答案 0 :(得分:0)

从技术上讲,至少你不能调用一个构造函数 不是你的意思。 (表达如 std::ofstream( "test.txt" )看起来像你正在打电话 构造函数,但标准将其称为显式类型 转换。)定义时调用构造函数 一个变量,例如在声明std::ofstream file;(其中 调用默认构造函数)。当你写file(...)时, 编译器在类型中查找重载的operator() file;没有一个,所以这是一个错误。

目前尚不清楚你真正想做什么,所以很难 提供准确的建议。但有一件事是肯定的:你做到了 想要变量的定义(例如 标头中的std::ofstream file;在命名空间范围内)。如果你 do,那个标题只能包含在一个来源中,或者你可以包含在内 最终有多个定义。 (这样的定义是 在标题中的类定义中是合理的。)充其量,你 我希望标题中有extern std::ofstream file; 定义在一个(也是唯一一个)源文件中 包括那个标题;在定义中,您可以提供 将用于建筑的论据。除了那个 我无法想到有一个有意义的环境 std::ofstream在命名空间范围内。

编辑:

从您的问题更新,从错误消息,它 看起来file是一个成员变量。在那种情况下,你 在初始化列表中为构造函数提供任何参数 构造函数:

MainWindow::MainWindow()
    : file( "test.txt" )
{
}

当然,如果它是会员,你就无法访问它 有一个类的实例。通常情况并非如此 在静态成员函数中。

编辑:

更新后:您是否仍然不清楚 fichier是否是静态成员。通常,会有 只有一个MainWindow个对象;两个用户都有权访问 它? (这通常是首选解决方案。)如果是这样, 没有问题使它成为非静态的,并将其初始化为 以上。或者你可以传递一个引用(fichier 成员)直接到线程。这是我的解决方案 喜欢。或者,您可以将其声明为静态。在那里面 例如,您需要在一个中明确定义它 一个源文件:

std::ofstream MainWindow::fichier;

然后你会在构造函数中打开它:

fichier.open( "test.txt" );

如果有多个实例,这可能会导致问题 MainWindow被构建。

最后,从您显示的代码:只有线程实际使用 该文件,因此可能更喜欢将其声明为本地文件 lancerServer函数中的变量。没有意义 如果只有一个线程可以使它对几个线程可见 访问它。如果这是由于您发布的简化 代码, 由多个线程使用,然后您需要 添加代码以同步访问。