我有一个文件,我想在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),我不知道如何在静态函数中使用这个文件。
答案 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
函数中的变量。没有意义
如果只有一个线程可以使它对几个线程可见
访问它。如果这是由于您发布的简化
代码, 由多个线程使用,然后您需要
添加代码以同步访问。