Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wxwidgets wxGrid析构函数在上触发断点_Wxwidgets_Wxgrid - Fatal编程技术网

Wxwidgets wxGrid析构函数在上触发断点

Wxwidgets wxGrid析构函数在上触发断点,wxwidgets,wxgrid,Wxwidgets,Wxgrid,我是wxWidgets的新手,尽管到目前为止我已经能够让一个应用程序正常运行。对于主窗口,我在wxPanel中使用wxGrid。在我关闭程序之前,一切正常 提前感谢您提供的任何见解 网格是从wxPanel派生的类的成员: class FormDataView : public wxPanel { public: FormDataView(wxWindow* parent); virtual ~FormDataView(); private:

我是wxWidgets的新手,尽管到目前为止我已经能够让一个应用程序正常运行。对于主窗口,我在wxPanel中使用wxGrid。在我关闭程序之前,一切正常

提前感谢您提供的任何见解

网格是从wxPanel派生的类的成员:

class FormDataView
        : public wxPanel
    {

public:
    FormDataView(wxWindow* parent);
    virtual ~FormDataView();

private:
        wxGrid* grid_;
    }
并在构造函数中创建。网格的数据来自另一个线程,因此我创建了一个自定义事件来实际写入数据

wxDEFINE_EVENT(FORMDATAVIEW_UPDATE, wxThreadEvent);


FormDataView::FormDataView(wxWindow* parent)
        :   wxPanel(parent,wxID_ANY )
    {

    wxBoxSizer* mbox = new wxBoxSizer(wxVERTICAL);
    grid_ = new wxGrid(this, wxID_ANY );
    grid_->CreateGrid(0, 0);


    mbox->Add(grid_,wxSizerFlags(1).Expand());


    Bind(FORMDATAVIEW_UPDATE, &FormDataView::onDataUpdate, this);

    }


///
/// This function is called by a child thread when data is received.
///
void
FormDataView::onDataReceived(IFORMATTERBASE_PFONDATARECEIVED_ARGS)
    {
    newHeaders_ = headers;
    newData_ = data;

    wxThreadEvent* evt = new wxThreadEvent(FORMDATAVIEW_UPDATE);
    evt->SetString("Yo.");
    wxQueueEvent(this, evt);

    }


///
/// Called by the event loop. This function puts the data
/// into the grid.
///
void 
FormDataView::onDataUpdate(wxThreadEvent& evt)
    {
    FormatterStringList& headers = newHeaders_;
    FormatterStringList& data = newData_;

    if (grid_->GetNumberRows() <= 0)
        {

        wxGridCellAttr* attr = new wxGridCellAttr();
        attr->SetReadOnly(true);
        attr->SetAlignment(wxALIGN_CENTRE, wxALIGN_CENTRE);
        for (size_t i = 0; i<headers.size(); ++i)
            {

            if (grid_->GetNumberCols() <= 0)
                grid_->InsertCols();
            else
                grid_->AppendCols();


            grid_->SetColLabelValue(i, headers[i].data());
            grid_->SetColAttr(i, attr);
            }
        }


    // suspend redrawing while we add data.
    grid_->BeginBatch();

    // insert a new row at the top of the table
    grid_->InsertRows(
        0, // position
        1, // number of rows to insert
        true); // update labels (not current used)


    for (size_t i = 0; i<headers.size(); ++i)
        {

        if (data.size() < i)
            {
            grid_->SetCellValue(0, i, "");
            }
        else
            {
            grid_->SetCellValue(0, i, data[i].data());
            }
        }

    // resume redrawing.
    grid_->EndBatch();
    }
wxDEFINE\u事件(FORMDATAVIEW\u更新,wxThreadEvent);
FormDataView::FormDataView(wxWindow*父级)
:wxPanel(父级,wxID_ANY)
{
wxBoxSizer*mbox=新的wxBoxSizer(wxVERTICAL);
grid_uu=新的wxGrid(这个,wxID_uany);
网格->创建网格(0,0);
mbox->Add(网格,wxSizerFlags(1.Expand());
绑定(FORMDATAVIEW\u UPDATE,&FORMDATAVIEW::onDataUpdate,this);
}
///
///当接收到数据时,子线程调用此函数。
///
无效的
FormDataView::onDataReceived(IFORMATTERBASE\u pOnDataReceived\u参数)
{
newHeaders=标题;
新数据=数据;
wxThreadEvent*evt=新的wxThreadEvent(FORMDATAVIEW\u更新);
evt->SetString(“Yo”);
wxQueueEvent(本,evt);
}
///
///由事件循环调用。此函数用于放置数据
///进入网格。
///
无效的
FormDataView::onDataUpdate(wxThreadEvent&evt)
{
FormatterStringList&headers=newHeaders;
FormatterStringList&data=newData;
if(grid->GetNumberRows()SetReadOnly(true);
属性->设置对齐(wxALIGN_中心,wxALIGN_中心);
对于(size_t i=0;iGetNumberCols()InsertCols();
其他的
网格->附录();
网格->SetColLabelValue(i,头[i].data());
网格->SetColAttr(i,attr);
}
}
//添加数据时暂停重绘。
网格->开始批次();
//在表格顶部插入新行
网格->插入行(
0,//位置
1,//要插入的行数
true);//更新标签(当前未使用)
对于(size_t i=0;iSetCellValue(0,i,”);
}
其他的
{
网格->设置单元值(0,i,数据[i].data());
}
}
//继续重画。
网格->结束批处理();
}
一切运行正常,但当我关闭时,我得到以下消息。我已经指出了断点出现的那一行。我应该遵循的从网格中清除数据的顺序是否有缺陷

wxGrid::CellSpan
wxGrid::GetCellSize( int row, int col, int *num_rows, int *num_cols ) const
{
    wxGridCellAttr *attr = GetCellAttr(row, col);
    attr->GetSize( num_rows, num_cols );
    attr->DecRef();

>>>>>>>    if ( *num_rows == 1 && *num_cols == 1 )
        return CellSpan_None; // just a normal cell

    if ( *num_rows < 0 || *num_cols < 0 )
        return CellSpan_Inside; // covered by a multi-span cell

    // this cell spans multiple cells to its right/bottom
    return CellSpan_Main;
}
wxGrid::CellSpan
wxGrid::GetCellSize(int行,int列,int*num\u行,int*num\u列)常量
{
wxGridCellAttr*attr=GetCellAttr(行,列);
属性->获取大小(行数、列数);
attr->DecRef();
>>>>>>>如果(*num_rows==1&&*num_cols==1)
返回单元格span\u None;//仅为普通单元格
if(*num_rows<0 |*num_cols<0)
return CellSpan_Inside;//被多span单元格覆盖
//此单元格向右/向下跨越多个单元格
返回单元span_Main;
}

问题在于我创建列属性的位置。我对每个列重新使用相同的列属性实例,但每个列都需要有自己的实例

之前:

if (grid_->GetNumberRows() <= 0)
    {

    ///
    /// NO! The columns will share the same cell attribute
    /// instance.
    ///
    wxGridCellAttr* attr = new wxGridCellAttr();
    attr->SetReadOnly(true);
    attr->SetAlignment(wxALIGN_CENTRE, wxALIGN_CENTRE);
    for (size_t i = 0; i<headers.size(); ++i)
        {

        if (grid_->GetNumberCols() <= 0)
            grid_->InsertCols();
        else
            grid_->AppendCols();


        grid_->SetColLabelValue(i, headers[i].data());
        grid_->SetColAttr(i, attr);
        }
    }
if(grid)->GetNumberRows()SetReadOnly(true);
属性->设置对齐(wxALIGN_中心,wxALIGN_中心);
对于(size_t i=0;iGetNumberCols()InsertCols();
其他的
网格->附录();
网格->SetColLabelValue(i,头[i].data());
网格->SetColAttr(i,attr);
}
}
正确:

if (grid_->GetNumberRows() <= 0)
    {
    for (size_t i = 0; i<headers.size(); ++i)
        {

        if (grid_->GetNumberCols() <= 0)
            grid_->InsertCols();
        else
            grid_->AppendCols();


        grid_->SetColLabelValue(i, headers[i].data());

        ///
        /// Each column will have its own cell attribute.
        /// Supposedly, the column will take ownership of this
        /// instance.
        ///
        wxGridCellAttr* attr = new wxGridCellAttr();
        attr->SetReadOnly(true);
        attr->SetAlignment(wxALIGN_CENTRE, wxALIGN_CENTRE);
        grid_->SetColAttr(i, attr);
        }
    }
if(grid->GetNumberRows()AppendCols();
网格->SetColLabelValue(i,头[i].data());
///
///每列都有自己的单元格属性。
///据推测,该专栏将拥有该网站的所有权
///例如。
///
wxGridCellAttr*attr=新的wxGridCellAttr();
属性->设置只读(真);
属性->设置对齐(wxALIGN_中心,wxALIGN_中心);
网格->SetColAttr(i,attr);
}
}

您显示的代码中没有错误,但这只是意味着错误存在于您未显示的代码中,这使得很难(如果不是不可能的话)找到它。至少看看代码崩溃的原因,可能堆栈跟踪显示了一些提示…(同时检查发生错误的线程)。事实上,问题出在显示的代码中;我今天早上就解决了。我有点尴尬。编辑了带更正的代码。这确实是一个错误,但无法解释崩溃。您的代码中的某个地方有另一个错误。这肯定是崩溃的原因。我在一个新项目中测试并能够重现该问题,该项目已完成除了上面的代码什么都没有。这似乎完全不可能,但我愿意被证明是错的——请对wxWidgets中包含的问题进行最小的修改,并打开一张罚单。