Hy से रोका नहीं जा सकता,क्यूटी टाइमर एक और धागा
मैं अपनी पहली क्यूटी कार्यक्रम लिख रहा हूँ और साथ मुसीबतों में अब हो रही:
QObject :: killTimer: टाइमर एक और धागा से रोका नहीं जा सकता
QObject :: startTimer: टाइमर एक और धागा
मेरे प्रोग्राम है जो मैं कर रहा हूँ के लिए एक CANOpen बस के साथ संचार करेगा से शुरू नहीं किया जा सकता Canfestival Stack का उपयोग कर। कैनफ़ोस्ट कॉलबैक विधियों के साथ काम करेगा। संचार में टाइमआउट का पता लगाने के लिए मैंने एक टाइमर फ़ंक्शन सेट किया है (किसी भी तरह वॉचडॉग की तरह)। मेरा टाइमर पैकेज "टीएमआर" मॉड्यूल, "टाइमरफॉरएफडब्ल्यू अपग्रेड" मॉड्यूल और "सिंगल टाइमर" मॉड्यूल से बाहर है। "टीएमआर" मॉड्यूल मूल रूप से सी प्रोग्राम किया गया था, इसलिए स्थैतिक "टाइमरफॉरएफडब्ल्यू अपग्रेड" विधियों को इंटरफ़ेस किया जाएगा। "टीएमआर" मॉड्यूल सी प्रोग्राम किए गए फर्मवेयर अपडेट पैकेज का हिस्सा होगा।
टाइमर निम्नानुसार काम करेगा। संदेश भेजने से पहले मैं TMR_Set विधि को कॉल करूंगा। उसके बाद टीएमआर_आईएस के साथ मेरे निष्क्रिय प्रोग्राम लूप में हम टाइमर अंडरफ्लो की जांच करते हैं। अगर 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 (इंटरफ़ेस सी कार्यक्रम के लिए):
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;
}
आपके पास बहुत ऊपर है। आप 'क्यूटीमर' वर्ग का उपयोग क्यों नहीं करते? –
'isElapsed()' का शरीर इतना गलत है। – UmNyobe
@UmNyobe क्या आप मुझे और जानकारी दे सकते हैं? शरीर में क्या गलत है? धन्यवाद – Matt