2

QwtPlotにプロットできるように、常にデータを追加しているQVectorがあります。しかし、頻度が高いと、ベクトルが大きくなりすぎてプログラムがクラッシュすると思います。

私の質問は、ある時点で始まっているだけの QwtCurve を作成するにはどうすればよいかということです。なぜなら、すでにプロットされているので、すでに経過した時間はベクトルには必要ないからです。

ここに私のコードがあります:

QVector<double> xv;
QVector<double> cv1;
QVector<double> cv2;

グローバル変数として、

void gui::process_new_info(QByteArray array)
{
    int v = 0;

    double f = ui->frequency->value();

    xv.append(sizeof_array/f);

    char *buf = array.data();

    if (ui->ecgPlux->isChecked() == true || ui->channel_1->currentIndex() != 0)
    {
        cv1.append(buf[1]);

        QwtPlotCurve *curve1 = new QwtPlotCurve;
        curve1->attach(plot_all[0]);
        curve1->setData(xv,cv1);
        curve1->setPen(QPen(Qt::blue,1));
        plot_all[0]->replot();

        QwtPlotCurve *curve2 = new QwtPlotCurve;
        curve2->attach(plot[0]);
        curve2->setData(xv,cv1);
        curve2->setPen(QPen(Qt::blue,1));
        plot[0]->replot();
    }

    if (ui->xyzPlux->isChecked() == true || ui->channel_2->currentIndex() != 0)
    {
        cv2.append(buf[2]);

        QwtPlotCurve *curve3 = new QwtPlotCurve;
        curve3->attach(plot_all[1]);
        curve3->setData(xv,cv2);
        curve3->setPen(QPen(Qt::blue,1));
        plot_all[0]->replot();

        QwtPlotCurve *curve4 = new QwtPlotCurve;
        curve4->attach(plot[1]);
        curve4->setData(xv,cv1);
        curve4->setPen(QPen(Qt::blue,1));
        plot[1]->replot();
    }

    //printf ("%d ->", buf[0]);
    fprintf (data, "%d,", buf[0]);

    for (int i = 1; i < 9; i++)
    {
        v = buf[i];
        //printf ("%d,", v);
        fprintf (data, "%d,", v);
    }

    //printf ("\n");
    fprintf (data, "\n");

    sizeof_array++;
}
4

1 に答える 1

2

QwtPlotCurve

http://qwt.sourceforge.net/class_qwt_plot_curve.html

から継承QwtPlotSeriesItem

http://qwt.sourceforge.net/class_qwt_plot_series_item.html

に警告がありますsetData

アイテムはデータ オブジェクトの所有権を取得し、使用されなくなったら削除します。

おそらく、大きくなりすぎているという事実ではありません... Qwt が削除したものにアクセスしている可能性があります。

デバッガーで実行し、スタック トレースを調べて停止した場所を確認するか、一連のqDebug()行を挿入して、停止している場所を確認します。

データが大きすぎる場合は、ベクトルを設定する前に、ベクトルの頭から項目をポップオフできます。

それが役立つことを願っています。

于 2013-03-12T22:33:10.677 に答える