dataprocthreadとcalcvalueの 2 つのクラスを持つ C++ Qt 静的ライブラリがあります。最初のものでは、calcvalueのインスタンスからメソッドを呼び出すと、( dataprocthreadthis
クラスを参照する)ポインターが突然 になります。null
これはdataprocthread.hです:
class DataProcThread : public QThread
{
Q_OBJECT
public:
DataProcThread(int sarray[9], int val);
signals:
workDone(int result);
private:
int _sarray[9];
int _val;
void run();
};
dataprocthread.cpp :
DataProcThread::DataProcThread(int sarray[9], int val)
{
for (int x = 0; x < 9; x++)
{
_sarray[x] = sarray[x];
}
_val = val;
}
void DataProcThread::run()
{
CalcValue* cv = new CalcValue();
int myval = 0;
for (int i = 0; i < 100; i++)
{
myval = cv->processData(this->_val);
if (this->_sarray[0] != myval)
{
//do something
}
}
emit workDone(intValue);
}
計算値.h :
class CalcValue
{
public:
CalcValue();
int processData(int someval);
};
計算値.cpp :
CalcValue::CalcValue()
{
}
int processData(int someval)
{
//do something and return int value
}
このコードを実行すると、突然「セグメンテーション違反」というシグナルを受け取ります。デバッガーを使用して、関数に問題があることがわかりました。関数DataProcThread::run()
を呼び出すとcv->processData
、すべて正常に動作します。しかし、次の行 ( if (this->_sarray[0] != myval)
) では、this
ポインターが(Locals ウィンドウで確認できます) になるため、変数null
にアクセスできません。this->_sarray
重要な場合は、それがスレッドを開始する方法です(ライブラリ外の別のクラスから):
DataProcThread* thread = new DataProcThread(sarray, val);
QObject::connect(thread, SIGNAL(workDone(int)), this, SLOT(collectWork(int)));
thread->start();
私が間違っていることは何ですか?