2017-10-17 2 views
0

私は2つのプロセスを作り、それらを互いに通信させようとしています。それらのうちの1つは、win32comを使用してCOMライブラリを介して値を取得し、もう1つはキューを介して最初のプロセスから値を取得し、それらを出力します。私は以下のコードは問題ありませんが、動作しません(p2プロセスは値を全く表示しません)。同じプロセス内の最初のプロセスプリントキューの値を同じプロセスで作成するだけであれば、キューに値が表示されます。だから、私はキューに値を入れても何の問題を持っていないと思うし、それゆえ、win32comPythonでCOMとマルチプロセッシングを同時に使用する方法はありますか?

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_()     

を使用して、queue経由で値をやり取りにおけるいくつかの問題があるかもしれない誰も私にいくつかのアドバイスを与えることができますか?

答えて

1

リスナーとRealTrEventHandlerクラスでqをグローバルとして明示的に宣言しようとしましたか?例えば:

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

(少なくとも)スレッド間で変数を渡すのもう一つの方法は、buildinsモジュールを使用しているが、私はマルチプロセッシングはそんなに違うのかはわかりません。

+0

ありがとうございました。私はこのようにqを宣言しようとしましたが、違いはありません。はい、私は多分このスレッド(https://stackoverflow.com/questions/26764978/using-win32com-with-multithreading)は私の問題と関係があると思うが、マルチプロセッシングとDispatchWithEvents。 – maynull

関連する問題