gpt4 book ai didi

c++ - Qt 计时器不能从另一个线程停止

转载 作者:可可西里 更新时间:2023-11-01 15:10:23 28 4
gpt4 key购买 nike

你好,

我正在编写我的第一个 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 程序的接口(interface)):

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,并使用SIGNALSSLOT 来启动和停止来自不同线程的计时器.您可以从任何线程发出信号,并在创建定时器的线程中捕获它。

既然您说您是 Qt 的新手,我建议您在继续之前先阅读一些教程,这样您就会知道 Qt 必须提供什么,而不会最终试图重新发明轮子。 :)

VoidRealms是一个很好的起点。

关于c++ - Qt 计时器不能从另一个线程停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26461887/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com