嗨,
我正在编写我的第一个 Qt 程序,但现在遇到了以下问题:
QObject::killTimer:定时器不能从另一个线程停止
QObject::startTimer:定时器不能从另一个线程启动
我的程序将与 CANOpen 总线通信,因为我正在使用Canfestival Stack。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;
}