我正在开发一种测试工具,用于从PC并行端口生成波形.该工具的目的是产生波形的任何模式与定时毫秒的准确性,所以我使用的Lua脚本来定义波形模式,GUI启动新的QThread运行脚本时用户点击[开始]按钮.
Lua的以下三个函数被实现为C++全局函数:
当调用pwrite时,写入的数据存储在全局变量中,然后以20ms的间隔更新GUI以更新GUI上的并行端口数据.(这20毫秒刷新间隔是不是一个很好的设计,但我还没有搞清楚如何使用信号进行GUI更新,当数据发生变化).
该工具现在基本上是功能性的.波形输出没有问题,但并行端口数据更新有一些问题:
当Lua调用msleep时,GUI线程停止,并行端口数据仅在msleep结束后更新.
所以我的问题是:
如何实现sleep方法,以便它不会阻止GUI线程更新?
如何实现pwrite,以便GUI在写入数据发生变化时可以接收信号来更新并行端口数据?
程序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); …Run Code Online (Sandbox Code Playgroud) 我想从Go执行perforce命令行"p4"来执行登录作业."p4登录"要求用户输入密码.
如何在Go中运行需要用户输入的程序?
以下代码不起作用.
err = exec.Command(p4cmd, "login").Run()
if err != nil {
log.Fatal(err)
}
Run Code Online (Sandbox Code Playgroud)