रोका गया है मैं पीसी समांतर बंदरगाह से तरंग उत्पन्न करने के लिए एक परीक्षण उपकरण विकसित कर रहा हूं। यह टूल एमएस की समय सटीकता के साथ तरंग के किसी भी पैटर्न को उत्पन्न करने के लिए डिज़ाइन किया गया है, इसलिए मैं तरंग पैटर्न को परिभाषित करने के लिए लुआ स्क्रिप्ट का उपयोग करता हूं, जीयूआई स्क्रिप्ट चलाने के लिए नया QThread शुरू करता है जब उपयोगकर्ता क्लिक [प्रारंभ] बटन करता है। लुआ के लिएनैनोस्ली() लूआ लिपि से कॉल क्यूटी जीयूआई थ्रेड
निम्नलिखित तीन कार्यों सी ++ वैश्विक कार्यों के रूप में लागू किया जाता है:
- pwrite: समानांतर पोर्ट के लिए डेटा लिखने।
- msleep: कुछ एमएस (नैनोस्लीप() का उपयोग करके लागू)
- प्रिंट: लुआ डिफ़ॉल्ट प्रिंट फ़ंक्शन को ओवरराइट करें, यह एक QTextEdit विजेट को संदेश संलग्न करेगा।
जब पिरिट कहा जाता है, लिखित डेटा वैश्विक चर में संग्रहीत होता है, तो GUI को जीयूआई पर समांतर बंदरगाह डेटा को अद्यतन करने के लिए 20ms अंतराल के साथ अद्यतन किया जाता है। (यह 20 एमएमएस अंतराल ताज़ा एक अच्छा डिजाइन नहीं है, लेकिन मुझे पता नहीं चला है कि डेटा बदलते समय जीयूआई अपडेट करने के लिए सिग्नल का उपयोग कैसे करें)।
उपकरण मूल रूप से कार्यात्मक है। वेवफ़ॉर्म आउटपुट में कोई समस्या नहीं है, लेकिन समांतर बंदरगाह डेटा अपडेटिंग में कुछ समस्या है:
जब लूआ कॉल स्लीप करता है, तो GUI थ्रेड बंद हो जाता है, समांतर बंदरगाह डेटा अपडेट केवल मिस्ली समाप्त होने के बाद ही होता है।
तो मेरी प्रश्न हैं:
कैसे नींद विधि लागू करने के लिए इतना है कि यह अद्यतन करने से जीयूआई धागा बंद नहीं होगा?
पिरिट को कैसे कार्यान्वित करें, ताकि जीआईआई लिखित डेटा बदलते समय समानांतर पोर्ट डेटा को अपडेट करने के लिए सिग्नल प्राप्त कर सके? नीचे दिए गए लिंक के रूप में
कार्यक्रम जीयूआई:
संबंधित कोड:
/* common.cpp file */
int L_MSleep(lua_State* l)
{
int milisec=0;
struct timespec req={0, 0};
time_t sec;
milisec=luaL_optint(l,1,0); // obtain parameter
if (milisec==0)
return 0;
sec=(int)(milisec/1000);
milisec=milisec-(sec*1000);
req.tv_sec=sec;
req.tv_nsec=milisec*1000000L;
while(nanosleep(&req,&req)==-1)
continue;
return 1;
}
/* LuaRunner.cpp file */
LuaRunner::LuaRunner(QObject *parent) :
QThread(parent)
{
runlua = false;
}
void LuaRunner::run()
{
QString err = "";
runlua = true;
LUA_RunScript(this->ff, err);
runlua = false;
if(err != "")
{
emit errorMessage(err);
}
}
int LuaRunner::LUA_RunScript(QString ff, QString &err)
{
L = lua_open();
luaL_openlibs(L);
if (luaL_loadfile(L, ff.toAscii()) || lua_pcall(L, 0, 0, 0))
{
err = QString(lua_tostring(L, -1));
return -1;
}
lua_register(L, "ssleep", L_SSleep);
lua_register(L, "msleep", L_MSleep);
lua_register(L, "pwrite", L_PortWrite);
lua_register(L, "print", L_Log);
lua_getglobal(L, "dotest");
if (!lua_isfunction(L, -1))
{
err = QString("Test function(dotest) should be a function");
return -1;
}
if(lua_pcall(L, 0, 0, 0))
{
err = QString(lua_tostring(L, -1));
return -1;
}
lua_close(L);
return 0;
}