2009-04-08 18 views
12

, sürekli iş yaparak. Programda, bir simülasyon oluşturabilir ve program sizin için (= hesaplar) oluşturur. Rendering bazen çok zaman alıcı olabilir. Python/wxPython: Bir wxPython arayüzü ile Python içinde simülasyonlar çalıştırmak için bir program yapıyorum arka

kullanıcı ben kullanıcı programında farklı şeyler yapıyor olabilir iken program arka planda sürekli simülasyon işlemek istiyorum, bir simülasyon başlatır ve bir başlangıç ​​aşamasını tanımlayan zaman. Doldurulan bir YouTube stili çubuk gibi sırala: Simülasyonu yalnızca işlenen noktaya kadar oynayabilirsiniz.

nasıl oluşturma işlevi çalışmalıdır ?

cevap

4

başlatın arka planda işlemek ve periyodik olarak iade olup olmadığını görmek için kontrol etmek yeni bir süreç.

Alt işlem modülü here ve çok işlemcili modül here belgelerini bulabilirsiniz. Jay'in dediği gibi, Python 2.6 kullanıyorsanız, çok işlem daha iyi olur. Bununla birlikte, ikisi arasında herhangi bir performans farkı olacağını düşünmüyorum. Multiprocess, belirli işlemlerin yapılmasını kolaylaştıran alt işlemlerin etrafında bir sarıcı gibi görünüyor.

Alt işlem/çoklu işlem bunu yapmanın standart yolu olsa da, Parallel Python'a da bakmak isteyebilirsiniz.

+0

Daha önce birden süreçlerle hiç çalışmadım. Nereden başlarım? Ayrıca, bunu yapmanın farklı yolları olduğunu anladım. Hangisini seçmeliyim? –

+0

N.B., bunun simülasyon yapmak için bir program olduğundan, performansın çok önemli olduğunu unutmayın. –

+0

Eğer python 2.6'yı kullanabilirseniz, çok işlemcili modülün bunu başarmanın standart yolu olacağına inanıyorum. İşletim sisteminiz ve donanımınız kadar performans göstermelidir. –

7

Arka plandaki kodu çalıştırmak için threading.Thread ve pencereyi iş parçacığı için kullanıcıya iletmek için güncelleştirmeleri göndermek için wx.CallAfter kullanırdım. Eğer çok az farklı yaklaşım kullanarak sakıncası yoksa

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

, sen stackless piton bir göz ve render işlemi için bir tasklet oluşturabilirsiniz. Şahsen kullanmak çok kolay.

7

yararlı olabilir wxPython wiki about long running tasks üzerine bilgi adil biraz var. Temel olarak iş parçacığı ve ana wx olay döngüsü arasındaki iletişimi işlemek için bir iş parçacığı ve wx.PostEvent kullanırlar.

İlgili konular