2012-08-22 18 views
5

Tôi đang cố gắng hoàn thành một cách để sinh ra một chuỗi chờ đầu vào của người dùng; nếu không có đầu vào nào được nhập trong vòng 10 giây, tôi muốn tập lệnh xóa chuỗi đã sinh ra và tiếp tục xử lý. Tôi đã có một cách để có được đầu vào trở lại từ các chủ đề nếu văn bản được nhập vào nhưng tôi không có cách nào để cho giết thời gian chờ ra khỏi thread mới sinh ra.chờ đầu vào của người dùng trong chủ đề riêng biệt

Trong ví dụ dưới đây là gần nhất tôi đã đến. Tôi nói với các chủ đề mới được tạo ra rằng nó là một daemon và nó sẽ thoát ra khi kịch bản chính thoát. Vấn đề mà tôi có với điều này là các chủ đề sẽ tiếp tục chờ đợi cho đến khi một trong hai kịch bản thoát, hoặc người dùng đã nhập một cái gì đó.

shared_var = ['1'] 
def run(ref): 
    ref[0] = raw_input("enter something: ") 
    print "shared var changed to '%s'" % (ref[0]) 

thread = threading.Thread(target=run, args=(shared_var,)) 
thread.daemon = True 
thread.start() 
time.sleep(10) # simplified timeout 

#Need some way to stop thread if no input has been entered 
print "shared var = " + shared_var[0] 

Tôi biết đột ngột giết chết một chủ đề không phải là cách tốt nhất để đi (Related Link), nhưng tôi không biết làm thế nào để làm gián đoạn các chủ đề mới chờ đợi trên raw_input

Trả lời

3

Hình như không có cách nào để sử dụng thời gian đầu vào. Trong liên kết mà SmartElectron cung cấp, giải pháp không hoạt động vì bộ hẹn giờ bị tạm dừng khi yêu cầu raw_input.

Giải pháp tốt nhất cho đến thời điểm này là:

# Declare a mutable object so that it can be pass via reference 
user_input = [None] 

# spawn a new thread to wait for input 
def get_user_input(user_input_ref): 
    user_input_ref[0] = raw_input("Give me some Information: ") 

mythread = threading.Thread(target=get_user_input, args=(user_input,)) 
mythread.daemon = True 
mythread.start() 

for increment in range(1, 10): 
    time.sleep(1) 
    if user_input[0] is not None: 
     break 
1

trong trường hợp của bạn don' đừng lo lắng cho việc đóng thread đột ngột. Trong liên kết, hãy nói

Thông thường, đây là mẫu không tốt để tiêu diệt một chuỗi đột ngột, bằng trăn và bằng bất kỳ ngôn ngữ nào. Hãy nghĩ đến những trường hợp sau đây:

  • thread đang nắm giữ một nguồn lực quan trọng phải được đóng đúng cách.
  • chủ đề đã tạo một số chủ đề khác cũng phải bị giết.

Đóng kết nối cơ sở dữ liệu, tệp được mở, tài nguyên vv cần được đóng đúng cách, trong trường hợp này đóng chủ đề đúng là cơ bản. Trong trường hợp này giải pháp của bạn là hợp lệ. *

Nếu giải pháp này không làm hài lòng bạn có thể sử dụng How to set time limit on input

Các vấn đề liên quan