別のスレッドからメインスレッドの関数を呼び出しますか?

LookMoneyStatus

私は3つのスレッドを持っています。各スレッドはを格納しvalます。そして、各スレッドはWebSocketからメッセージを受信します。ときは、on_message()各スレッドで呼び出され、val更新され、私は合計する私のメインスレッドで関数を呼び出すしたいされval、すべての3つのスレッドの秒。

thread1.start()
thread2.start()
thread3.start()

私の現在の解決策は

while True:
    sum = thread1.val + thread2.val + thread3.val

問題は、このコードが100%CPUを使用していsumて、val更新されていなく繰り返し計算していることですただし、スレッドが更新さsleep()れるとすぐにval合計を計算する必要があるため、使用したくありませんキューの使用について読んだことがありますがQueue、すべてを実行する必要はなく、最新のものだけを実行する必要があるため、使用したくありません。ではon_message()、スレッド1、2、または3で呼び出されたときに、メインスレッドで関数を呼び出す方法はありますか?

SCB

これをQueue行うには、実際にはAが適切な方法です。更新された各値がキューに追加され、メインスレッドは毎回アイテムが追加されるのを待ちます。ある種の「イベントストリーム」としてフォーマットして、どこから来たのかを知ることができます。キュー内の各値は次のようになります。

{
    "source": "THREAD_A",
    "value": 42
}

各スレッドには、ある種のproduce()機能があると思います次のようになります。

def produce(event_queue):
    while True:
        value = do_something()
        event_queue.put({"source": ME, "value": value})

そして、メインスレッドで:

values = {"THREAD_A": 0, "THREAD_B": 0, "THREAD_C": 0}
while True:
    s = sum(values.values())
    # ...
    last_event = event_queue.get()
    values[last_event["source"]] = last_event["value"]

このget()関数により、メインスレッドは次のイベントが発生するまで待機し、その後続行してその値を処理します。そのため、新しいメッセージが到着するたびに1回だけ再計算されます。

あなたのon_message()比喩を維持するために、あなたはあなたがlast_event呼び出す値として考えることができますon_message()、そしてそれの直後に起こるすべてはそのメソッドの内部として考えられます。つまり、必要に応じて、独自のメソッドとして記述できます。

values = {"THREAD_A": 0, "THREAD_B": 0, "THREAD_C": 0}
def on_message(v, message):
    v[last_event["source"]] = last_event["value"]
    s = sum(v.values())
    # ...

while True:
    last_message = event_queue.get()
    on_message(values, last_message)

これがあなたに少しのアイデアを与えることを願っています。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

独自のスレッドを持つ他のオブジェクトからJavaでメインクラスの関数を呼び出すと、この関数は別のスレッドで実行されますか?

分類Dev

バックグラウンドスレッドからメインスレッドの関数を呼び出す

分類Dev

別のスレッドから制御メソッドを呼び出す方法

分類Dev

別のスレッドからFormメソッドを呼び出す(Invoke)

分類Dev

クラスメンバー関数のアドレスを取得し、ポインターから呼び出す

分類Dev

メインスレッドでメソッドを呼び出しますか?

分類Dev

別のスレッドからメソッドを呼び出すと、メインスレッドがブロックされる

分類Dev

Androidのセカンダリスレッドからメインスレッドを呼び出す

分類Dev

非同期関数でメインスレッドの完了を呼び出すのはなぜですか?

分類Dev

メインスレッドは、いくつかのスレッドのstart()メソッドを呼び出した直後に制御を取得しますか?

分類Dev

JNIを使用して別のスレッドから静的Javaメソッドを呼び出す

分類Dev

Java:元のスレッドのコンテキストで、別のスレッドからコールバックを呼び出します

分類Dev

pthread_createを使用してスレッドからクラスメンバー関数を呼び出す

分類Dev

メインスレッドからメソッドを呼び出す-UnityEngineC#

分類Dev

別のクラスから関数を呼び出しますか?アンドロイド

分類Dev

MFC:別のスレッドからCWndメソッドを呼び出すのは安全ですか?

分類Dev

メインスレッドでのqueue.join()の呼び出しは、非メインスレッドに対して何をしますか?

分類Dev

Qtは他のスレッドからイベントループに関数呼び出しを追加します

分類Dev

別のスレッドまたはインテントサービスからgetWritableDatabase()を呼び出す方法、メインスレッドで呼び出すとアプリがクラッシュする

分類Dev

別のスレッドで呼び出される関数にパラメータを渡します

分類Dev

DLLからオフセットアドレスを使用してメンバー関数を呼び出す

分類Dev

複数のスレッドからのaccept()の呼び出し

分類Dev

waitとnotifyを呼び出した後、メインスレッドから2つのスレッドを結合しようとしました

分類Dev

JavaのスレッドからJMX接続を呼び出しますか?

分類Dev

異なるファイバーからのメインスレッドを必要とする関数を呼び出す

分類Dev

メイン関数からprintメソッドを呼び出し、別の別のメソッドのデータを使用するJava

分類Dev

Javaの同じクラスの別の同期メソッド内に作成された新しいスレッドから同期メソッドを呼び出す

分類Dev

2番目のスレッドデザインパターンからメインスレッドオブジェクトメソッドを呼び出す

分類Dev

JNIのスレッド内からJAVAメソッドを呼び出す方法

Related 関連記事

  1. 1

    独自のスレッドを持つ他のオブジェクトからJavaでメインクラスの関数を呼び出すと、この関数は別のスレッドで実行されますか?

  2. 2

    バックグラウンドスレッドからメインスレッドの関数を呼び出す

  3. 3

    別のスレッドから制御メソッドを呼び出す方法

  4. 4

    別のスレッドからFormメソッドを呼び出す(Invoke)

  5. 5

    クラスメンバー関数のアドレスを取得し、ポインターから呼び出す

  6. 6

    メインスレッドでメソッドを呼び出しますか?

  7. 7

    別のスレッドからメソッドを呼び出すと、メインスレッドがブロックされる

  8. 8

    Androidのセカンダリスレッドからメインスレッドを呼び出す

  9. 9

    非同期関数でメインスレッドの完了を呼び出すのはなぜですか?

  10. 10

    メインスレッドは、いくつかのスレッドのstart()メソッドを呼び出した直後に制御を取得しますか?

  11. 11

    JNIを使用して別のスレッドから静的Javaメソッドを呼び出す

  12. 12

    Java:元のスレッドのコンテキストで、別のスレッドからコールバックを呼び出します

  13. 13

    pthread_createを使用してスレッドからクラスメンバー関数を呼び出す

  14. 14

    メインスレッドからメソッドを呼び出す-UnityEngineC#

  15. 15

    別のクラスから関数を呼び出しますか?アンドロイド

  16. 16

    MFC:別のスレッドからCWndメソッドを呼び出すのは安全ですか?

  17. 17

    メインスレッドでのqueue.join()の呼び出しは、非メインスレッドに対して何をしますか?

  18. 18

    Qtは他のスレッドからイベントループに関数呼び出しを追加します

  19. 19

    別のスレッドまたはインテントサービスからgetWritableDatabase()を呼び出す方法、メインスレッドで呼び出すとアプリがクラッシュする

  20. 20

    別のスレッドで呼び出される関数にパラメータを渡します

  21. 21

    DLLからオフセットアドレスを使用してメンバー関数を呼び出す

  22. 22

    複数のスレッドからのaccept()の呼び出し

  23. 23

    waitとnotifyを呼び出した後、メインスレッドから2つのスレッドを結合しようとしました

  24. 24

    JavaのスレッドからJMX接続を呼び出しますか?

  25. 25

    異なるファイバーからのメインスレッドを必要とする関数を呼び出す

  26. 26

    メイン関数からprintメソッドを呼び出し、別の別のメソッドのデータを使用するJava

  27. 27

    Javaの同じクラスの別の同期メソッド内に作成された新しいスレッドから同期メソッドを呼び出す

  28. 28

    2番目のスレッドデザインパターンからメインスレッドオブジェクトメソッドを呼び出す

  29. 29

    JNIのスレッド内からJAVAメソッドを呼び出す方法

ホットタグ

アーカイブ