ハイ、
私は最初の Qt プログラムを書いていますが、次のような問題が発生しています。
QObject::killTimer: タイマーは別のスレッドから停止できません
QObject::startTimer: タイマーは別のスレッドから開始できません
私のプログラムは、Canfestival Stackを使用しているため、CANOpen バスと通信します。Canfestival はコールバック メソッドで動作します。通信のタイムアウトを検出するために、タイマー機能を設定します(どういうわけかウォッチドッグのようなものです)。私のタイマー パッケージは、「tmr」モジュール、「TimerForFWUpgrade」モジュール、および「SingleTimer」モジュールで構成されています。「tmr」モジュールはもともと C でプログラムされていたので、静的な「TimerForFWUpgrade」メソッドがインターフェースします。「tmr」モジュールは、C プログラムのファームウェア更新パッケージの一部になります。
タイマーは次のように動作します。メッセージが送信される前に、TMR_Set メソッドを呼び出します。次に、TMR_IsElapsed を使用したアイドル プログラム ループで、タイマーのアンダーフローをチェックします。TMR_IsElapsed の場合、エラー処理を行います。ご覧のとおり、TMR_Set メソッドが継続的に呼び出され、QTimer が何度も再起動されます。
プログラムを起動すると、上記のエラーが表示されます。私のコンセプトがうまくいくかどうか教えてもらえますか? このエラーが表示されるのはなぜですか? メインスレッドに追加のスレッド (QThread) を使用する必要がありますか?
ありがとうございました
マット
実行とアイドル ループ:
void run
{
// start communicate with callbacks where TMR_Set is set continously
...
while(TMR_IsElapsed(TMR_NBR_CFU) != 1);
// if TMR_IsElapsed check for errorhandling
....
}
モジュール tmr (C プログラムへのインターフェース):
extern "C"
{
void TMR_Set(UINT8 tmrnbr, UINT32 time)
{
TimerForFWUpgrade::set(tmrnbr, time);
}
INT8 TMR_IsElapsed(UINT8 tmrnbr)
{
return TimerForFWUpgrade::isElapsed(tmrnbr);
}
}
モジュール TimerForFWUpgrade:
SingleTimer* TimerForFWUpgrade::singleTimer[NR_OF_TIMERS];
TimerForFWUpgrade::TimerForFWUpgrade(QObject* parent)
{
for(unsigned char i = 0; i < NR_OF_TIMERS; i++)
{
singleTimer[i] = new SingleTimer(parent);
}
}
//static
void TimerForFWUpgrade::set(unsigned char tmrnbr, unsigned int time)
{
if(tmrnbr < NR_OF_TIMERS)
{
time *= TimerForFWUpgrade::timeBase;
singleTimer[tmrnbr]->set(time);
}
}
//static
char TimerForFWUpgrade::isElapsed(unsigned char tmrnbr)
{
if(true == singleTimer[tmrnbr]->isElapsed())
{
return 1;
}
else
{
return 0;
}
}
モジュール シングルタイマー:
SingleTimer::SingleTimer(QObject* parent) : QObject(parent),
pTime(new QTimer(this)),
myElapsed(true)
{
connect(pTime, SIGNAL(timeout()), this, SLOT(slot_setElapsed()));
pTime->setTimerType(Qt::PreciseTimer);
pTime->setSingleShot(true);
}
void SingleTimer::set(unsigned int time)
{
myElapsed = false;
pTime->start(time);
}
bool SingleTimer::isElapsed()
{
QCoreApplication::processEvents();
return myElapsed;
}
void SingleTimer::slot_setElapsed()
{
myElapsed = true;
}