您好,
我正在编写我的第一个Qt程序,遇到了以下问题:
QObject::killTimer: timers cannot be stopped from another thread
QObject::startTimer: timers cannot be started from another thread
我的程序将与CANOpen总线通信,我使用Canfestival Stack来实现。Canfestival将使用回调方法工作。为检测通信超时,我设置了一个定时器函数(类似于看门狗)。我的计时器包括“tmr”模块、“TimerForFWUpgrade”模块和“SingleTimer”模块。“tmr”模块最初是C语言编写的,因此静态的“TimerForFWUpgrade”方法将与其进行接口处理。 “tmr”模块将成为C语言编写的固件更新包的一部分。
计时器将按以下方式工作。在发送消息之前,我将调用TMR_Set方法。然后,在我的空闲程序循环中,使用TMR_IsElapsed检查定时器下溢。如果TMR_IsElapsed,则进行错误处理。如您所见,TMR_Set方法将不断地被调用并重启QTimer。
如果我启动程序,上述错误将出现。您能告诉我我的概念是否可行吗?为什么会出现这些错误?我是否需要使用额外的线程(QThread)来处理主线程?
谢谢,
Matt
运行和空闲循环:
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::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;
}
QTimer
类呢? - Dmitry SazonovQCoreApplication::processEvents();
。它不应该在那里。你可能需要在 run() 的 while 循环中使用它,但它现在不应该在那里。 - UmNyobe