wxWidgets - 在没有活动异常的情况下终止调用(使用std :: thread)

时间:2014-08-21 10:36:15

标签: c++ multithreading c++11 wxwidgets

我正在编写使用我自己的库的GUI应用程序,该库基于boost::asio C ++ 11标准库。这是gui_client::OnInit的{​​{1}}和gui_client::OnExit方法的实现,它们来自gui_client

wxApp

所有内容编译和应用程序启动。我在命令行中看到调试信息('返回OnInit')然后:

  

在没有活动异常的情况下终止被调用

我尝试在某些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; } 函数的gdb中设置断点,但我找不到返回错误的位置。 wxApp类只有三种方法:

  • gui_client
  • virtual bool OnInit()
  • virtual int OnExit()

当我没有启动读者线程(client * get_client())时,一切都运行良好。当我在lambda函数中启动带空循环的线程时,我得到了上面提到的错误。我还确定线程代码是正确的,因为相同的代码在CLI测试应用程序中运行良好。

我使用std::thread readerwxWidgets 3.0.1.0(Debian)。我使用这个g ++命令进行编译:

g++ 4.7.2

和此命令用于链接:

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

1 个答案:

答案 0 :(得分:1)

问题出在这里:

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

reader_thread = &reader;
reader函数结束后,

OnInit将被销毁(并且将调用terminate,因为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);