基本的に2つの「スレッド」を備えた、作り直されたpython cursesコードがあります。それらは実際のスレッドではありません。1 つはメインのサブウィンドウ処理関数であり、もう 1 つは別のサブウィンドウ処理関数であり、タイマーで実行されます。そして、私は興味深い効果に出くわしました:
- メイン ウィンドウ コードは、getstr() を使用してユーザーの入力を待機しています。
- 同時にタイマー割り込みが発生し、割り込みコードが別のサブウィンドウに何かを出力します。
- タイマー関数からの出力により、getstr() は空の入力を返します。
この影響の原因は何ですか? 戻り文字列をチェックする以外に、この影響を回避する方法はありますか?
問題を再現するサンプル コード:
#!/usr/bin/env python
# Simple code to show timer updates
import curses
import os, signal, sys, time, traceback
import math
UPDATE_INTERVAL = 2
test_bed_windows = []
global_count = 0
def signal_handler(signum, frame):
global test_bed_windows
global global_count
if (signum == signal.SIGALRM):
# Update all the test bed windows
# restart the timer.
signal.alarm(UPDATE_INTERVAL)
global_count += 1
for tb_window in test_bed_windows:
tb_window.addstr(1, 1, "Upd: {0}.{1}".format(global_count, test_bed_windows.index(tb_window)))
tb_window.refresh()
else:
print("unexpected signal: {0}".format(signam))
pass
def main(stdscr):
# window setup
screen_y, screen_x = stdscr.getmaxyx()
stdscr.box()
# print version
version_str = " Timer Demo v:0 "
stdscr.addstr(0, screen_x - len(version_str) - 1, version_str)
stdscr.refresh()
window = stdscr.subwin(screen_y-2,screen_x-2,1,1)
for i in range(3):
subwin = window.derwin(3,12,1,2 + (15*i))
test_bed_windows.append(subwin)
subwin.box()
subwin.refresh()
signal.signal(signal.SIGALRM, signal_handler)
signal.alarm(UPDATE_INTERVAL)
# Output the prompt and wait for the input:
window.addstr(12, 1, "Enter Q/q to exit\n")
window.refresh()
the_prompt = "Enter here> "
while True:
window.addstr(the_prompt)
window.refresh()
curses.echo()
selection = window.getstr()
curses.noecho()
if selection == '':
continue
elif selection.upper() == 'Q':
break
else:
window.addstr("Entered: {0}".format(selection))
window.refresh()
if __name__ == '__main__':
curses.wrapper(main)