我正在開發一個感測器讀取程序,其中該程序的一部分涉及當金屬目標進一步或靠近感測器時列印出感測器狀態的即時更新。 “main_gui.py”檔案將首先運行,一旦使用者點擊“開始資料檢索”按鈕,它將啟動子進程“ies2v2.py”,在其中執行感測器讀取過程並列印出來。
下面的程式碼顯示了最初在控制台中列印的程式碼如何列印到 gui 中。
def start_data_retrieval(self): # start a new thread for data retrieval threading.thread(target=self.retrieve_data_thread).start() def retrieve_data_thread(self): selected_current = loadcurrent[currentgrp.get()] selected_output = outputtype[outputgrp.get()] print(f"selected current: {selected_current}, selected output: {selected_output}") with subprocess.popen(["python", "ies2v2.py", "--port", self._port, "--current", selected_current.name, "--output", selected_output.name], stdout=subprocess.pipe, stderr=subprocess.stdout) as process: for line in process.stdout: line = line.decode() # defaulting to system encoding text_box.insert(end, line) text_box.update() text_box.see(end) process.poll()
運行exe時,我在將語句打印到gui上時遇到延遲,一旦單擊“開始數據檢索”按鈕,打印數據將匆忙地以大塊數據的形式打印出來,並且在之前有很長的延遲再次列印。我希望它能像 pycharm 一樣順利運行...
注意:我在建立 exe 時也遇到了問題,出現這樣的錯誤。我透過將找不到的檔案複製到路徑中來修復它,並且 exe 從我這邊運行正常。僅供參考,以防這可能是延遲的原因......但我認為不應該如此。
編輯:ies2v2.py程式碼(其中一些)下面是讀取感測器輸出並不斷更新的部分。
print('\n---- Reading Data ----') print("Live update of sensor data PROCESS_ADDR will begin. Press the 'Enter' key to stop the updates.") time.sleep(5) prev_process_addr = ies2.get_value(122) while True: print(f'Update of PROCESS_ADDR : {ies2.get_value(122)}') # SU new_process_addr = ies2.get_value(122) if new_process_addr != prev_process_addr: print(f"PROCESS_ADDR value changed! {prev_process_addr} to {new_process_addr}") prev_process_addr = new_process_addr if keyboard.is_pressed('enter'): print("\nKey pressed! Stopping the sensor updates.") break
正如我們在評論中發現的那樣,子進程沒有刷新其標準輸出緩衝區,這就是導致延遲的原因。刷新標準輸出的一種方法是在呼叫 print
函數時新增 flush=True
。
以上是如何解決透過 EXE 運行程式時的延遲和滯後問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!