2010-10-05 7 views
0

Je dois décaper l'objet [objet cadre wxpython] et l'envoyer en tant que prameter à cette fonction apply_async sur le module de la piscine multiprocès quelqu'un pourrait-il me donner un exemple comment puis-je le faire J'ai essayé ce qui suit et j'ai une erreur message:Décapage des objets

myfile = file(r"C:\binary.dat", "w") 
pickle.dump(self, myfile) 
myfile.close() 


self.my_pool.apply_async(fun,[i,myfile]) 

def fun(i,self_object): 
    window = pickle.load(self_oject) 
    wx.CallAfter(window.LogData, msg) 

quelqu'un pourrait me dire ce qui pourrait être le problème

Si l'erreur donne un indicateur au-dessous du dernier message d'erreur que je reçois: fichier "C: \ Python26 \ lib \ copy_reg.py" , ligne 70, dans _reduce_ex raise TypeError, "can" t pickle% s objets "% base. Nom TypeError: ne peut pas décaper les objets PySwigObject

+2

Je ne sais pas enought au sujet le décapage mais le Hould ErrorMessage être utile pour d'autres aides. – kasten

Répondre

1

Vous ne pouvez pas sérialiser un widget pour l'utiliser dans un autre processus. Je suppose que vous voulez changer le contenu de l'interface graphique d'un autre processus qui est démarré par le module multiprocessing. Dans ce cas, vous devez définir une fonction de rappel dans le processus parent qui est appelée lorsque le résultat du sous-processus est prêt. Par conséquent, vous pouvez utiliser le paramètre "callback" de apply_async.

Quelque chose comme:

def fun(i): 
    # do something in this sub-process and then return a log message 
    return "finished doing something" 

def cb(resultFromFun): 
    wx.CallAfter(window.LogData, resultFromFun) 

my_pool.apply_async(fun, [i], callback = cb) 
+0

C'est vraiment ce dont j'avais besoin merci beaucoup – AKM

1

Je ne crois pas que les objets wxPython peuvent être décapés. Ils ne sont que des wrappers autour d'objets C, qui contiennent beaucoup de pointeurs et d'autres éléments dynamiques. Le module pickle n'en sait pas assez sur eux pour pouvoir restaurer leur état par la suite.