2017-10-17 19 views
0

J'essaye de faire deux processus et de les faire communiquer les uns aux autres. L'un d'entre eux obtient des valeurs via une bibliothèque COM en utilisant win32com, et l'autre obtient simplement les valeurs du premier processus via une file d'attente et les imprime. Je pense que le code ci-dessous n'a pas de problème, mais ça ne marche pas (le processus p2 n'affiche aucune valeur). Si je viens de faire les premières valeurs de file d'impression de processus dans le même processus parComment puis-je utiliser COM et le multitraitement en même temps en Python?

item = self.q.get() 
print(item) 

il montre des valeurs dans la file d'attente. Donc, je pense mettais des valeurs dans la file d'attente n'a pas de problème, et par conséquent, il pourrait y avoir des problèmes en matière d'échange de valeurs via le queue, en utilisant win32com

import win32com.client 
import os 
import multiprocessing as mp 
from PyQt4.QtGui import QApplication 
from datetime import datetime, timedelta 

global q 
q = mp.Queue()   # A queue is used to send values from p1 to p2               

class RealTrEventHandler(object):   
    def __init__(self): 
     self.q = q                

    def OnReceiveRealData(self,szTrCode): 
     date = datetime.utcnow() + timedelta(hours=3) 
     type = self.GetFieldData("OutBlock", "cgubun") 

     appending_line = date + ', ' + type 

     self.q.put(appending_line) 
     #item = self.q.get()      # it prints values out if these are not comments 
     #print(item) 

def ticker(): 
    loop = QApplication([]) 
    global instXASession, instXAReal 
    print('TICKER: ', os.getpid()) 

    # When an event occurs, it calls RealTrEventHandler class 
    instXAReal = win32com.client.DispatchWithEvents("XA_DataSet.XAReal", RealTrEventHandler) 
    instXAReal.LoadFromResFile("C:\\eBEST\\xingAPI\\Res\\OVC.res") 
    instXAReal.SetFieldData("InBlock", "symbol", "CLX17") 

    loop.exec_() 

class listener(mp.Process):   # What listener does is only to get values via the queue and prints them out 
    def __init__(self): 
     mp.Process.__init__(self) 
     self.q = q 

    def run(self): 
     print('CSM PID: ', os.getpid()) 
     while True: 
      item = self.q.get() 
      print(item) 

if __name__ == '__main__': 
    loop = QApplication([])  

    print('MAIN: ', os.getpid()) 
    p1 = mp.Process(target = ticker, args=()) 
    p1.start() 

    p2 = listener() 
    p2.start() 

    mp.freeze_support() 

    loop.exec_()     

Quelqu'un pourrait-il me donner quelques conseils?

Répondre

1

Avez-vous essayé de déclarer explicitement q comme global dans votre classe d'écouteur et RealTrEventHandler? .: par exemple

class listener(mp.Process): 
    global q 
    def __init__(self): 
     mp.Process.__init__(self) 
     self.q=q 

Une autre façon de passer entre les variables threads (au moins) utilise le buildins-module, mais je ne sais pas si multitraitement est tellement différent.

+0

Merci pour la réponse. J'ai essayé de déclarer q comme ça, mais il n'y a pas de différence. Oui, je pense que peut-être ce fil (https://stackoverflow.com/questions/26764978/using-win32com-with-multithreading) a quelque chose à voir avec mon problème, mais je ne suis pas sûr que ce soit la même chose en utilisant le multitraitement et DispatchWithEvents. – maynull