首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在wxWidgets中创建全局wxCriticalSection变量是不是很糟糕?

在wxWidgets中创建全局wxCriticalSection变量是不是很糟糕?
EN

Stack Overflow用户
提问于 2018-01-14 21:03:56
回答 2查看 297关注 0票数 0

我正在使用wxTreeListCtrl显示一棵树。对于树节点的每个扩展,我创建了一个线程,它调用后端API并返回响应。在每个线程执行之后,将执行一个HandleExpansionRequest(),它将响应元素添加到树中。这些操作运行得很好。

问题是:情况1:当线程执行后端函数时,同时如果用户关闭主机,则在Entry()中执行wxQueueEvent时会出现异常。为了解决这个问题:我不是在关闭窗口时删除线程,而是使用一个变量isFrameClosed,并在线程为主代码创建wxQueueEvent之前检查它。我的疑问是,在框架关闭但线程仍在执行(因为我正在创建全局wxCriticalSection )之后,这是停止程序崩溃的好方法吗?

代码语言:javascript
运行
复制
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_TREELIST_ITEM_EXPANDED(wxID_ANY, MyFrame::OnItemExpand)   
EVT_THREAD(ITEM_BROWSE_WORKER_EVENT,MyFrame::OnExpandThreadCompletion)
END_EVENT_TABLE()

//using below 2 variables to avoid crash when item expansion request is sent and user closes the frame.
 wxCriticalSection cs_forisFrameClosed;
 static bool isFrameClosed;

MyFrame::MyFrame()
{
   {
    wxCriticalSectionLocker lock(cs_forisFrameClosed);
    isFrameClosed = false;
   }
   //remaining code ...
}

MyFrame::~MyFrame()
{
   {
    wxCriticalSectionLocker lock(cs_forisFrameClosed);
    isFrameClosed = true;
   }
}

void MyFrame::OnItemExpand(wxTreeListEvent& event)
{
     MyThread *thread = new MyThread(this);
    if (thread->Create() != wxTHREAD_NO_ERROR)
    {
        PrintError(__FUNCTION__, "Can't create thread!");
    }
    thread->Run();
}

MyThread::MyThread(MyFrame *frame) : wxThread()
{
    m_frame = frame;
}

wxThread::ExitCode MyThread::Entry()
{
    string resp;
    GetResponseFromBackEnd(resp);
    {
        wxCriticalSectionLocker lock(cs_forisFrameClosed);
        if (!isFrameClosed)
        {
            wxThreadEvent event(wxEVT_THREAD, ITEM_BROWSE_WORKER_EVENT);
            event.SetString(resp);
            wxQueueEvent(m_frame, event.Clone());
        }
    }
}


void MyFrame::OnExpandThreadCompletion(wxThreadEvent &event)
{
    // this function is executed after every thread returns.
    // take response from event and update tree with children.      
}
EN

回答 2

Stack Overflow用户

发布于 2018-01-15 01:21:21

正如the docs所说,分离的线程会自行删除,所以您不能删除它们,因为这会导致删除两次。相反,您必须实现某种与线程通信的方式,并在该执行时要求它退出。wxMessageQueue提供了一种最简单的方法。

票数 1
EN

Stack Overflow用户

发布于 2018-01-14 22:07:08

尝试在close方法中加入()所有派生的线程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48249848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档