2
0
forked from Ivasoft/DSView

fix: The xcursor got an invalid dsosignal object after the signal is destroied

This commit is contained in:
dreamsourcelabTAI
2023-03-27 15:44:57 +08:00
parent 2c6e5b347c
commit fd5b4f26c1
4 changed files with 21 additions and 11 deletions

View File

@@ -758,7 +758,8 @@ namespace pv
break;
}
}
dsv_info("SigSession::init_signals(), clear signals");
clear_signals();
std::vector<view::Signal *>().swap(_signals);
@@ -854,6 +855,7 @@ namespace pv
if (!sigs.empty())
{
dsv_info("SigSession::reload(), clear signals");
clear_signals();
std::vector<view::Signal *>().swap(_signals);
_signals = sigs;
@@ -1989,7 +1991,7 @@ namespace pv
}
init_signals();
dsv_info("%s", "Work mode is changed.");
dsv_info("Switch work mode to:%d", mode);
broadcast_msg(DSV_MSG_DEVICE_MODE_CHANGED);
return true;
}
@@ -2070,7 +2072,7 @@ namespace pv
{
auto *p = _signals[i];
p->sig_released(p);
DESTROY_QT_LATER(p);
}
_signals.clear();

View File

@@ -158,6 +158,12 @@ uint64_t dslDial::get_max()
uint64_t dslDial::get_value()
{
this->_div = this->_div;
if (_sel < 0 || _sel >= _value.count()){
assert(false);
}
return _value[_sel];
}

View File

@@ -109,7 +109,7 @@ DsoSignal::DsoSignal(data::DsoSnapshot *data,
DsoSignal::DsoSignal(const DsoSignal &o)
:Signal(NULL)
{
{
}
DsoSignal::DsoSignal(DsoSignal &o)
@@ -119,7 +119,7 @@ DsoSignal::DsoSignal(DsoSignal &o)
DsoSignal::~DsoSignal()
{
DESTROY_OBJECT(_vDial);
DESTROY_OBJECT(_vDial);
}
void DsoSignal::set_scale(int height)
@@ -1502,6 +1502,7 @@ double DsoSignal::get_voltage(uint64_t index)
const double value = *_data->get_samples(index, index, get_index());
const int hw_offset = get_hw_offset();
return (hw_offset - value) * _scale *
_vDial->get_value() * _vDial->get_factor() *
DS_CONF_DSO_VDIVS / get_view_rect().height();
@@ -1509,19 +1510,15 @@ double DsoSignal::get_voltage(uint64_t index)
QString DsoSignal::get_voltage(double v, int p, bool scaled)
{
// if (_vDial == NULL)
// return "";
this->_hover_en = this->_hover_en;
if (_vDial == NULL){
assert(false);
}
}
if (scaled)
v = v * _vDial->get_value() * _vDial->get_factor() * DS_CONF_DSO_VDIVS / get_view_rect().height();
else
v = v * _scale * _vDial->get_value() * _vDial->get_factor() * DS_CONF_DSO_VDIVS / get_view_rect().height();
return abs(v) >= 1000 ? QString::number(v/1000.0, 'f', p) + "V" : QString::number(v, 'f', p) + "mV";
}

View File

@@ -25,6 +25,7 @@
#include "view.h"
#include "ruler.h"
#include "dsosignal.h"
#include "../log.h"
#include <QPainter>
@@ -162,6 +163,10 @@ void XCursor::paint(QPainter &p, const QRect &rect, XCur_type highlight, int or
auto sig = _view.session().get_signal_by_index(_sig_index);
if (sig != NULL){
_dsoSig = dynamic_cast<DsoSignal*>(sig);
if (_dsoSig != NULL){
connect(_dsoSig, SIGNAL(sig_released(void*)), this, SLOT(on_signal_deleted(void*)));
}
}
}