2016-04-28 15 views
0

私の限界は私の最悪の敵ですが、最も良い学習バディです。私はWorkerThread内からstartStopを呼び出す方法を見つけたい別のクラスからクラス関数を呼び出す

class VolumePanel(wx.Panel): 
    #<...snip...> 
    def launchVolClick(self, event): 
     if self.bt_Launch.Label == "Enable Monitor": 
      self.worker = WorkerThread(self) 
      self.bt_Launch.Label = "Disable Monitor" 
     else: 
      self.worker.ToKill = True 
      self.bt_Launch.Label = "Enable Monitor" 

    def startStop(self): 
     print "in def startStop()" 

class WorkerThread(Thread): 
"""Worker Thread Class.""" 
def __init__(self, notify_window): 
    """Init Worker Thread Class.""" 
    Thread.__init__(self) 
    self._notify_window = notify_window 
    self.ToKill = False 
    self._want_abort = 0 
    self.start() 

def run(self): 
    """Run Worker Thread.""" 
    while worker==True: 
     # somehow get to volumePanel.startStop() 

     if self.ToKill == True: 
      return None 
    proc.wait() 
    wx.PostEvent(self._notify_window, ResultEvent(None)) 
    return 

そして:

私は2つのクラスがあります。私はthisを試しましたが、それを動作させることができませんでした。

EDIT:

class WorkerThread(Thread): 
    """Worker Thread Class.""" 
    def __init__(self, notify_window, func): 
     """Init Worker Thread Class.""" 
     Thread.__init__(self) 
     self._notify_window = notify_window 
     self.ToKill = False 
     self._want_abort = 0 
     global function 
     function = func 
     self.start() 

    def run(self): 
     """Run Worker Thread.""" 
     while worker==True: 
      # somehow get to volumePanel.startStop() 
      function() 
      if self.ToKill == True: 
       return None 
     proc.wait() 
     wx.PostEvent(self._notify_window, ResultEvent(None)) 
     return 

    def launchVolClick(self, event): 
     if self.bt_Launch.Label == "Enable Volume Monitor": 
      self.worker = WorkerThread(self, self.startStop) 
      self.bt_Launch.Label = "Disable Volume Monitor" 
     else: 
      self.worker.ToKill = True 
      self.bt_Launch.Label = "Enable Volume Monitor" 

答えて

1

以下の最終的な作業のコードあなたがstartStopへの参照を渡すと、一つの選択肢として、スレッドクラス内から参照を呼び出すことができます。より多くのコード/コードがどのように構造化されているかを見ることなく、他のオプションについては言い難いです。

これは前者の工夫された例です。スレッドをVolumePanelに呼び出し、self.startStopを渡すことができるように、このような方法で物事を渡す必要はありません。

また、workerは未定義であるため、これがwxpythonの一部である場合を除き、procである場合は未定義です。

from threading import Thread 

class WorkerThread(Thread): 

    def __init__(self, func): 

     Thread.__init__(self) 
     self.func = func 

    def run(self): 

     for i in range(10): 
      self.func() 

class VolumePanel: 

    def __init__(self): 

     #self.thread = WorkerThread(self.startStop) 
     #self.thread.start() #or elsewhere 
     pass 

    def startStop(self): 

     print "in def startStop()" 

vp = VolumePanel() 
thread = WorkerThread(vp.startStop) 
thread.start() 
+0

を取得し、私は 'に' defのstartStop'を渡すことができますWorkerThread(スレッド) '?上記の 'WorkerThread'を開始するイベントを追加して、それが明快に役立つかどうかを確認しました。 – chow

+0

あなたは私が知る必要があったことを思い出しました。私は '__init__'宣言に' func'を追加し、グローバルを追加しました。 :)上記のコードを更新しました。 – chow

+0

これを属性にすると、グローバルは必要ありません。 'self.function'と' self.function() 'です。また、 'run'の最後に' return'は不要です。 'return None'を避けるために2つの条件をマージすることができます。 「労働者であり自己ではない」トキル – Pythonista

0

また、そのようなスレッドに呼び出し元のクラスをpasssことができます。私たちは関数を直接呼び出す代わりにwx.CallAfter()を使用

class WorkerThread(threading.Thread): 
    def __init__(self, parent): 
     super(WorkerThread, self).__init__() 
     self.parent = parent 

    def run(self): 
     for i in range(10): 
      wx.CallAfter(self.parent.startStop) 


class VolumePanel(object): 
    def startStop(self): 
     print "in def startStop()" 

注意してください。これは、直接呼び出した場合、実際にはMainThreadの代わりにスレッドから呼び出されているためです。これは、あなたが何をしているかによって、時には問題となることがあります。

我々はwx.CallAfterなし(threading.current_thread()付き)現在のスレッドをプリントアウトした場合、我々は

<WorkerThread(Thread-1, started 6612)> 
<WorkerThread(Thread-1, started 6612)> 
<WorkerThread(Thread-1, started 6612)> 
<WorkerThread(Thread-1, started 6612)> 
<WorkerThread(Thread-1, started 6612)> 
<WorkerThread(Thread-1, started 6612)> 
<WorkerThread(Thread-1, started 6612)> 
<WorkerThread(Thread-1, started 6612)> 
<WorkerThread(Thread-1, started 6612)> 
<WorkerThread(Thread-1, started 6612)> 

を取得するにはしかし、wx.CallAfterで、我々は

<_MainThread(MainThread, started 6604)> 
<_MainThread(MainThread, started 6604)> 
<_MainThread(MainThread, started 6604)> 
<_MainThread(MainThread, started 6604)> 
<_MainThread(MainThread, started 6604)> 
<_MainThread(MainThread, started 6604)> 
<_MainThread(MainThread, started 6604)> 
<_MainThread(MainThread, started 6604)> 
<_MainThread(MainThread, started 6604)> 
<_MainThread(MainThread, started 6604)> 
関連する問題