Opracowuję narzędzie testowe do generowania przebiegu z portu równoległego PC. To narzędzie jest zaprojektowane do generowania dowolnego wzoru przebiegu z dokładnością pomiaru czasu ms, więc używam skryptu Lua do definiowania wzoru przebiegu, GUI uruchamia nowy QThread, aby uruchomić skrypt, gdy użytkownik kliknie przycisk [Start].nanosleep() wywołanie z skryptu Lua przerwanego wątku QT GUI
trzy następujące funkcje dla Lua są zaimplementowane jako funkcje globalne C++:
- pwrite: zapisu danych do portu równoległego.
- msleep: czekaj na określony ms (zaimplementowany przy użyciu nanosleep())
- print: nadpisuje domyślną funkcję drukowania Lua, ta doda wiadomość do jednego widgetu QTextEdit.
Po wywołaniu pwrite zapisywane dane są przechowywane w zmiennej globalnej, następnie GUI jest aktualizowane z interwałem 20ms, aby zaktualizować dane portu równoległego w GUI. (to odświeżenie 20 ms nie jest dobrym projektem, ale nie wiem, jak użyć sygnału do aktualizacji GUI po zmianie danych).
Narzędzie jest teraz zasadniczo funkcjonalne. Wyjście fali nie stanowi problemu, ale aktualizacja danych portu równoległego napotyka pewien problem:
Kiedy Lua wywołuje msleep, wątek GUI jest zatrzymany, dane portu równoległego aktualizują się dopiero po zakończeniu funkcji msleep.
Więc moje pytania to:
Jak wdrożyć metodę snu tak, że nie zatrzyma wątek GUI z aktualizacją?
Jak zaimplementować pwrite, aby GUI mógł odbierać sygnał aktualizujący dane portu równoległego po zmianie danych pisanych?
GUI Program jak na poniższym linkiem:
dany przepis:
/* 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;
}