[python] Vlastní vlákno pro dlouhý výpočet.

Jakub Vojáček Jakohv na seznam.cz
Pátek Březen 2 16:46:08 CET 2007


> ------------ Původní zpráva ------------
> Od: Leos Pol <leos na radiante-corp.com>
> Předmět: Re: [python] Vlastní vlákno pro dlouhý výpočet.
> Datum: 02.3.2007 16:34:54


> Ja myslel, ze to pisete ve wxPythonu, tam se to da udelat velice hezky a 
> bez pouziti threadu. Nasledujici priklad je opis vaseho prikladu:
> 
> class Trida:
>    
>     def __init__(self):
>         Button(text="zacni",command=self.ok)
>         Button(text="stpL",command=self.stop)
>         self.p = True
> 
>     def ok(self):
>         while self.p:
>             print 'sss'
>             wx.Yield()
>    
>     def stop(self):
>         self.p = False
> 
> Priklad je jen nazorny zpusob, jak to jde udelat. Jinak tento priklad 
> jste mel v te referenci, kterou jste uvedl:
>     http://wiki.wxpython.org/index.cgi/LongRunningTasks
>   
> Doporucuji take poradne nastudovat fci wx.Yield, protoze muze dochazet 
> treba k opetovnemu kliknuti na stejny button, takze se tam musi dodelat 
> disable apod. Mimo jine, vyuziti tohoto zpusobu dojde k i tomu, ze 
> nebude aplikace "zamrzavat" po dobu vypoctu, pokud tedy nebude trvat 
> jeden cyklus ve while dlouho.
> 
> Leo
>

Děkuju, už sem to nějak udělal:

# -*- coding: cp1250 -*-
import wx
def dlouha_funkce(cislo):
    while cislo != 50:
        if not vypocet:return "Přerušeno"
        cislo=cislo+1
        print cislo
        wx.Yield()
    return "Výpočet dokončen"
class Okno:
    def __init__(self):
        
        self.okno=wx.Frame(None)
        button=wx.Button(self.okno,label="Počítej")
        button.Bind(wx.EVT_BUTTON, self.pocitej)
        button2=wx.Button(self.okno,label="Stop",pos=(40,40))
        button2.Bind(wx.EVT_BUTTON, self.stop)
        self.okno.Show(True)
    def pocitej(self,akce):
        global vypocet
        vypocet=True
        vysledek=dlouha_funkce(0)
        dlg = wx.MessageDialog(self.okno,vysledek, '', wx.OK | wx.ICON_INFORMATION)
        dlg.ShowModal()
    def stop(self,akce):
        global vypocet
        vypocet=False
if __name__ == "__main__":
    vypocet=True
    p = wx.App(0)
    Okno()
    p.MainLoop()


Dělal sem to hodně narychlo, takže se omlouvám za to hnusný global ve třídě;) 

Ještě jednou dík!!

Blujacker


Další informace o konferenci Python