建議在同一個循環中,只放置一個事件結構。此時,當一個事件發生時,事件結構將對事件進行處理,然后繼續循環,事件結構再等待下一個事件發生。
如在同一個循環中放置兩個事件結構,只有在兩個事件結構都處理了事件后,循環才能繼續。如對事件結構啟用了前面板鎖定,用戶與前面板交互時,VI的界面可能會發生不響應。
例如,在同一個While循環中放置兩個事件結構,用第一個事件結構處理“鼠標按下”事件,用第二個事件結構處理“鍵按下”事件,當用戶單擊鼠標時,第一個事件結構將收到一個“鼠標按下”事件。第一個事件結構可正確處理該事件並結束執行。同時,第二個事件結構將等待“鍵按下”事件發生。如用戶按下某個鍵,第二個事件結構將收到“鍵按下”事件。當第二個事件結構結束對事件的處理時,將繼續下一個While循環。如用戶不斷地在兩個操作之間切換:觸發“鼠標按下”事件、“鍵按下”事件、“鼠標按下”事件、“鍵按下”事件等等,事件結構按預期處理發生的事件,循環得以繼續,VI可流暢地運行。
然而,如用戶單擊鼠標之后再次單擊,連續觸發了兩個“鼠標按下”事件,其間沒有發生“鍵按下”事件,用戶界面將陷入掛起狀態。當用戶第一次單擊鼠標時,第一個事件結構接收到一個“鼠標按下”事件並對事件進行處理,然后結束執行。然而,第二個事件結構將繼續等待“鍵按下”事件,從而阻止了下一個While循環的執行。當用戶第二次單擊鼠標時,labview將觸發第二個“鼠標按下”事件,並在第一個事件結構處理該事件之前鎖定前面板。於是,VI就陷入了死鎖狀態。第一個事件結構無法在下一個While循環開始之前執行,而下一個While循環又無法在第二個事件結構收到並處理“鍵按下”事件前開始。“鍵按下”事件將不可能發生,因為前面板已被鎖定。前面板將保持鎖定狀態,且無法響應用戶的操作,直到用戶中止該VI。
為避免前面板鎖定時用戶界面陷入掛起狀態,應單獨對VI中事件結構需要處理的所有事件進行配置,或者確保While循環中只包含一個事件結構。
此外,應確保任何時候總有一個可用的事件結構能夠處理發生的事件。
參考:
可能部分參考了網上的信息,由於是很久前寫在自己電腦本地的文章,最近被我搬到這里來的,所以記的不是太清晰。