2015-02-10 40 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