2016-09-18 26 views
0

我有以下代碼...當程序空閒 是有可能ForSE召開前夕fileevent之前要執行Fileevent PROC之前執行完畢

lassign [ chan pipe ] chan chanW 
fileevent $chan readable [ list echo $chan ] 

proc echo { chan } { 
    ... 
} 

proc exec { var1 var2 } { 
    .... 

    puts $chanW "Some output" 
    .... 

} 

現在根據人fileevent將被執行。例如,可以強制fileevent在通道變得可讀後立即執行,以某種方式使其優先....不使用線程:)

+0

聽起來你想要一個異步機制同步執行。它可以完成,但你確定這是你需要的嗎? –

+0

是的,學習TCL,所以即時通訊只是嘗試不同的東西,找到了一個方法來做到這一點,放置後的「更新」,是否有更好的方法? –

+0

另一種同步方法是'vwait'。我在想,也許你遇到了一個需要更好的解決方案的問題,但是如果你正在試驗的話,那就去找靈感引導你,祝你好運。 (儘管如此,也許你不應該用你自己的程序來破壞內置命令exec。) –

回答

2

Tcl從不在「意外」點執行事件處理程序;它只在要求明確這麼做的點上運行它們,或者在某些配置中(例如在wish之內)運行它,而不執行其他任何操作。您可以通過兩個命令引入一個明確的等待事件:

  • update

  • vwait

update命令清除下當前事件隊列,但不等待爲傳入事件(嚴格來說,它會執行操作系統級長度爲零的等待)。命令vwait也將允許真正的等待發生,等待一個命名的Tcl全局變量被寫入。 (它使用C級變量跟蹤來執行此操作,順便說一下)。執行其中的任何一個操作都會讓您的代碼在返回之前處理事件。請注意,這個功能還有很多其他的包裝器。 http包中的「geturl」命令(「同步」模式下)和Tk包中的tkwait命令都執行此操作。

併發症?在運行事件循環時,讓代碼無意中重新進入是非常容易的。這很容易導致你進行大量的嵌套事件循環調用,使你在堆棧空間中運行;不要這樣做。相反,爲重入問題做準備(全局變量檢查是最簡單的方法),以避免嵌套事件循環。

或者,如果您使用Tcl 8.6,則可以切換代碼以使用協程。他們讓您停止當前的過程評估並返回到主事件循環以等待將來的事件再次開始執行之前:您最終得到的代碼將在預期的時間返回,但會暫停一段時間。如果你想了解更多關於這種方法的信息,請在這裏另外提問。

相關問題