2015-02-10 96 views
1

我正在使用Lua和Qt编写用户界面,并且有一个过程可以在以下过程中为图片绘制一个矩形。目前我使用io.read()等待矩形由用户设置,然后按下“CTRL + D”继续程序。我想知道是否可以通过代码中断io.read(),这样一旦用户设置了矩形,程序就会自动运行。 更具体地说,这里是我要做的一个例子。如何在lua中中断io.read(),充当“等待”功能

function ui_select(x, y) 
    if x1 == -1 then -- First point of rectangle 
     x1 = x 
     y1 = y 
    else  -- Second point of rectangle 
     x2 = x 
     y2 = y 
     io.write(1) 
    end 
end 
qt.connect(qt.QtLuaListener(ui.frame_2.canvas), 'sigMousePress(int, int, QByteArray, QByteArray, QByteArray)', ui_select) 
x1 = -1 
y1 = -1 
x2 = 0 
y2 = 0 
ui.frame_2.can_label.text = 'Draw a rectangle around the object you want to track, finish with "<CTRL> + D"' 
io.read() 
-- Do something 

我想如果我能io.read中断()在ui_select功能,所以一旦用户绘制矩形,它会自动启动处理。

我不能只是把处理代码放入ui_select函数并删除io.read(),因为这是子程序,一旦没有io.read()等待用户的操作,它就会运行从头到尾不做任何事情并返回到主程序。

+0

我不明白你的程序的流程,但是在Unix世界里有一些叫做FIFO的东西:它是一个可与进程通信的“文件”。这样做:读取()该文件将阻塞,直到有可用的输入(也就是说,直到其他进程写入某些东西,例如,您的绘图应用程序可以写入“准备好矩形\ n”但确保刷新输出或赢得真的不会被发送)。 (至于你的“原始”问题:我知道读(2)可以被信号中断,你可能想要检查这个地点。) – 2015-02-11 03:58:17

+0

你能解释一些关于如何中断io.read(2) ?它是通过FIFO? – 2015-02-17 19:21:07

回答

0

您不能“中断”io.read()函数。你需要想出一个不同的机制来等待输入。例如,你可以有一个循环,让进程“休眠”250毫秒左右,然后检查你感兴趣的情况。这样你总是可以“断开”循环,并有各种适用于你的情况的条件。

+0

循环的休眠时间是否有下限?我试图使用“while”循环,但不知何故该程序被冻结在那里。 – 2015-02-11 02:51:45

+0

我确定qt有一些确实睡眠的API调用;看到这个[SO回答](http://stackoverflow.com/a/23169620/1442917)为例。 – 2015-02-11 04:04:29