wxWidgets - 终止调用而没有活动异常(使用 std::thread)
wxWidgets - terminate called without an active exception (using std::thread)
我正在编写GUI应用程序,该应用程序使用我自己的库,该库基于boost::asio
C++11标准库。这是类gui_client
的gui_client::OnInit
和gui_client::OnExit
方法的实现,这些方法派生自wxApp
:
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;
}
一切都编译完毕,应用程序启动。我在命令行中看到调试信息("返回 OnInit"(,然后:
终止调用而不显示活动异常
我尝试在某些wxApp
函数上gdb
设置断点,但找不到返回错误的位置。 gui_client
类只有三种方法:
-
virtual bool OnInit()
-
virtual int OnExit()
-
client * get_client()
当我不启动阅读器线程(std::thread reader
(时,一切正常。当我在lambda函数中启动带有空循环的线程时,我遇到了上面提到的错误。我也确定线程代码是正确的,因为相同的代码在 CLI 测试应用程序中运行良好。
我使用 wxWidgets 3.0.1.0
和 g++ 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
是可连接的(。在这种情况下,您应该在类中使用智能指针,或者使用 new
创建reader_thread
,或者只是将线程保存在对象中并通过移动将其分配给您的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);
相关文章:
- 使用std::multimap迭代器创建std::list
- 使用std::vector的OpenCL矩阵乘法
- 使用std::函数映射对象方法
- 使用"std::unordereded_map"映射到"std::list"对象
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用std::source_location报告错误的最佳实践
- 如何使用 std::累积在 C++ 中计算总和立方体
- 在一个模板函数中,若输入的类型是enum类,我该如何使用std::underlying_type
- 有效地使用std::unordered_map来插入或增加键的值
- 使用std::list创建循环链表
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 使用std::mt19937从字符串中返回一个随机单词
- 使用std::istream::peek()总是安全的吗
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 在template中使用std::variant的template函数
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 为什么在C++20中对lambdas使用"std::bind_front"
- 如何使用std::min和std::less返回对象
- 使用 std::string () const 函数启动线程或未来
- 在 QVector<std::unique_ptr 上使用 std::find<Type>>