PCパラレルポートから波形を生成するためのテストツールを開発しています。このツールは、タイミング精度がmsの任意の波形パターンを生成するように設計されているため、ユーザーが[Start]ボタンをクリックしたときにスクリプトを実行する新しいQThreadを開始するために、波形パターンを定義するLuaスクリプトを使用します。 LuaのためLuaスクリプトからのnanosleep()呼び出しがQT GUIスレッドを一時停止しました
次の三つの機能は、C++のグローバル関数として実装されている:
- PWRITEは:パラレルポートにデータを書き込みます。
- msleep:nanosleep()を使用して実装しました。
- print:Luaのデフォルトの印刷機能を上書きします。これは1つのQTextEditウィジェットにメッセージを追加します。
pwriteが呼び出されると、書き込まれたデータがグローバル変数に格納され、GUIのパラレルポートデータを更新するために20ms間隔でGUIが更新されます。 (この20ms間隔のリフレッシュは良い設計ではありませんが、データが変更されたときに信号を使ってGUIを更新する方法を理解していません)。
このツールは基本的に機能しています。波形出力に問題はありませんが、パラレルポートデータの更新には何らかの問題があります。
Luaコールmsleepでは、GUIスレッドは停止し、パラレルポートデータはmsleep終了後にのみ更新されます。
だから私の質問は以下のとおりです。
それが更新からGUIスレッドを停止しないようにスリープメソッドを実装する方法は?
書込みデータが変更されたときにGUIがパラレルポートデータを更新する信号を受け取れるように、pwriteを実装する方法は?
関連するコード:以下のリンクとして
プログラム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;
}