2009-04-08 12 views
12

Tôi đang tạo một chương trình để chạy mô phỏng bằng Python, với giao diện wxPython. Trong chương trình, bạn có thể tạo mô phỏng và chương trình hiển thị (= tính toán) cho bạn. Kết xuất đôi khi có thể rất tốn thời gian.Python/wxPython: Làm việc liên tục ở chế độ nền

Khi người dùng bắt đầu mô phỏng và xác định trạng thái ban đầu, tôi muốn chương trình hiển thị mô phỏng liên tục dưới nền, trong khi người dùng có thể thực hiện những việc khác nhau trong chương trình. Sắp xếp giống như một thanh kiểu YouTube lấp đầy: Bạn chỉ có thể chơi mô phỏng cho đến điểm được hiển thị.

Tôi nên chạy hàm hiển thị như thế nào?

Trả lời

4

Khởi chạy quy trình mới để hiển thị dưới nền và định kỳ kiểm tra xem nó có trả về hay không.

Bạn có thể tìm tài liệu cho mô-đun quy trình phụ here và mô-đun đa xử lý here. Như Jay đã nói, đa xử lý có thể tốt hơn nếu bạn đang sử dụng Python 2.6. Điều đó nói rằng, tôi không nghĩ rằng sẽ có bất kỳ sự khác biệt hiệu suất giữa hai người. Multiprocess dường như là một trình bao bọc xung quanh subprocess, làm cho một số việc dễ dàng hơn.

Trong khi quy trình con/đa xử lý là cách tiêu chuẩn để thực hiện việc này, bạn cũng có thể muốn xem Parallel Python.

+0

Tôi chưa từng làm việc với nhiều quy trình trước đây. Tôi bắt đầu từ đâu? Ngoài ra, tôi hiểu có nhiều cách khác nhau để làm điều đó. Tôi nên chọn cái nào? –

+0

N.B., hãy nhớ rằng vì đây là một chương trình để làm mô phỏng, hiệu suất là rất quan trọng. –

+0

Nếu bạn có thể sử dụng python 2.6, tôi tin rằng mô đun đa xử lý sẽ là cách tiêu chuẩn để hoàn thành việc này. Nó sẽ cung cấp cho bạn hiệu suất cũng giống như hệ điều hành và phần cứng của bạn đã cung cấp. –

7

Tôi sẽ sử dụng threading.Thread để chạy mã trong nền và wx.CallAfter để đăng cập nhật lên chuỗi cửa sổ của tôi để hiển thị chúng cho người dùng.

thread = threading.Thread(target=self.do_work) 
thread.setDaemon(True) 
thread.start() 

... 

def do_work(self): 
    # processing code here 
    while processing: 
     # do stuff 
     wx.CallAfter(self.update_view, args, kwargs) 

def update_view(self, args): 
    # do stuff with args 
    # since wx.CallAfter was used, it's safe to do GUI stuff here 
0

Nếu bạn không nhớ sử dụng một cách tiếp cận rất khác nhau một chút, bạn có thể có một cái nhìn tại stackless python và tạo ra một tasklet cho quá trình dựng hình của bạn. Tôi thấy nó rất dễ sử dụng.

7

Có một chút thông tin công bằng trên wxPython wiki about long running tasks có thể hữu ích. Về cơ bản, chúng sử dụng một luồng và wx.PostEvent để xử lý sự truyền thông giữa luồng và vòng lặp sự kiện wx chính.