Hỷ,giờ Qt không thể dừng lại từ một thread
Tôi đang viết chương trình Qt đầu tiên của tôi và nhận được bây giờ trong những rắc rối với:
QObject :: killTimer: giờ không thể dừng lại từ một thread
QObject :: startTimer: giờ không thể khởi động từ một thread
chương trình của tôi sẽ liên lạc với một chiếc xe buýt CANOpen cho rằng tôi là sử dụng Canfestival Stack. Canfestival sẽ làm việc với các phương thức gọi lại. Để phát hiện thời gian chờ trong giao tiếp, tôi thiết lập một chức năng hẹn giờ (bằng cách nào đó giống như một cơ quan giám sát). Gói bộ hẹn giờ của tôi bao gồm mô-đun "tmr", mô-đun "TimerForFWUpgrade" và mô-đun "SingleTimer". Mô-đun "tmr" ban đầu được lập trình C nên các phương thức "TimerForFWUpgrade" tĩnh sẽ giao tiếp nó. Mô-đun "tmr" sẽ là một phần của gói cập nhật Firmware được lập trình C.
Bộ hẹn giờ sẽ hoạt động như sau. Trước khi một tin nhắn được gửi, tôi sẽ gọi phương thức TMR_Set. Sau đó trong vòng lặp chương trình nhàn rỗi của tôi với TMR_IsElapsed, chúng tôi kiểm tra một bộ đếm thời gian. Nếu TMR_IsElapsed tôi sẽ làm lỗi. Khi bạn thấy phương thức TMR_Set sẽ được gọi liên tục và khởi động lại QTimer một lần nữa và một lần nữa.
Các lỗi được ghi chú ở trên sẽ xuất hiện nếu tôi bắt đầu chương trình của mình. Bạn có thể cho tôi biết liệu khái niệm của tôi có thể hoạt động không? Tại sao lỗi này xuất hiện? Tôi có phải sử dụng các luồng bổ sung (QThread) cho luồng chính không?
Cảm ơn bạn
Matt
Run và vòng lặp Nhàn rỗi:
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
....
}
Mô-đun tmr (giao diện cho chương trình C):
extern "C"
{
void TMR_Set(UINT8 tmrnbr, UINT32 time)
{
TimerForFWUpgrade::set(tmrnbr, time);
}
INT8 TMR_IsElapsed(UINT8 tmrnbr)
{
return TimerForFWUpgrade::isElapsed(tmrnbr);
}
}
Mô-đun 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;
}
}
Mô-đun 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;
}
Bạn có phí tuyệt vời. Tại sao bạn không sử dụng lớp 'QTimer'? –
phần thân của 'isElapsed()' rất sai. – UmNyobe
@UmNyobe Bạn có thể cho tôi biết thêm thông tin không? Có gì sai trong cơ thể của isElapsed? Cảm ơn – Matt