gpt4 book ai didi

c++ - wxWidgets - 在没有事件异常的情况下终止调用(使用 std::thread)

转载 作者:行者123 更新时间:2023-11-28 06:43:48 25 4
gpt4 key购买 nike

我正在编写 GUI 应用程序,它使用我自己的库,该库基于 boost::asio 一个 C++11 标准库。这是派生自 wxApp 的类 gui_clientgui_client::OnInitgui_client::OnExit 方法的实现:

bool gui_client::OnInit()
{
io_service_ = new boost::asio::io_service;
client_ = new client(*io_service_);
frame = new main_frame();

std::thread reader([this]() {
// thread code
});

reader_thread = &reader;

frame->Show();
Debug("Returning OnInit");
return true;
}

int gui_client::OnExit()
{
reader_thread->join();
return 0;
}

一切编译和应用程序启动。我在命令行('Returning OnInit')中看到调试信息,然后:

terminate called without an active exception

我试图在gdb中为某些wxApp函数设置断点,但找不到返回错误的地方。 gui_client 类只有三个方法:

  • 虚拟 bool OnInit()
  • 虚拟 int OnExit()
  • 客户端 * get_client()

当我不启动阅读器线程 (std::thread reader) 时,一切正常。当我在 lambda 函数中使用空循环启动线程时,出现了上面提到的错误。我也确信线程代码是正确的,因为相同的代码在 CLI 测试应用程序中运行良好。

我使用 wxWidgets 3.0.1.0g++ 4.7.2 (Debian)。我使用这个 g++ 命令进行编译:

g++ `wx-config --version=3.0 --cxxflags` -std=c++11 -I./headers -I../headers -L../lib/Debug -DDEBUG -g -c -o [obj_file] [source]

和这个链接命令:

g++ `wx-config --version=3.0 --cxxflags` -std=c++11 -I./headers -I../headers -L../lib/Debug -DDEBUG -g [obj_files] -ltamandua `wx-config --version=3.0 --libs` -lboost_system -pthread -o [output]

最佳答案

问题在这里:

std::thread reader([this]() {
// thread code
});

reader_thread = &reader;

reader将在 OnInit 之后销毁函数结束(并且终止将被调用,因为 thread 是可连接的)。在这种情况下,您应该在类中使用智能指针,或者创建 reader_thread使用 new ,或者简单地将线程保存在对象中并将其分配给您的 reader_thread (reader_thread 应该是对象,而不是指针)通过移动。

1) reader_thread = std::make_shared<std::thread>([this]() {});

2) reader_thread = new std::thread([this]() {});

3)

std::thread reader([this](){});
reader_thread = std::move(reader);

关于c++ - wxWidgets - 在没有事件异常的情况下终止调用(使用 std::thread),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25424162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com