ホームページ > バックエンド開発 > Python チュートリアル > `pygame.event.get()` が別のスレッドでイベントを返せないのはなぜですか?

`pygame.event.get()` が別のスレッドでイベントを返せないのはなぜですか?

Patricia Arquette
リリース: 2024-12-01 11:54:13
オリジナル
708 人が閲覧しました

Why Does `pygame.event.get()` Fail to Return Events in a Separate Thread?

pygame.event.get() が別のスレッド内でイベントを返せない

このクエリは、pygame.event を利用するときに発生する問題に関連しています。パックマン風のゲームでユーザー入力を管理するための別のスレッド内の .get()。入力の受信を担当するコード スニペットは次のとおりです。

def receiving_inputs(self):
    while True:
        events = pg.event.get()
        for event in events:
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_UP:
                    self.move = 'n'
                elif event.key == pg.K_RIGHT:
                    self.move = 'e'
                elif event.key == pg.K_DOWN:
                    self.move = 's'
                elif event.key == pg.K_LEFT:
                    self.move = 'w'
        time.sleep(1/60)

threading.Thread(target=self.receiving_inputs).start()
ログイン後にコピー

このコードが実行されると、キーボードのキーを押してもイベントはトリガーされませんが、マウスを動かすとイベントが返されます。興味深いことに、別のスレッドではなく、プログラムのメイン ループ内で実行すると、同じコードが問題なく機能します。

この質問は、別のスレッドを使用することで、メイン ループで登録されなくなるキー入力のインスタンスを最小限に抑えたいという要望から生じています。 .

解決策:

予期しない動作は、つまり、イベントはメインスレッド内で管理する必要があるということです。 pygame.event ドキュメントに記載されているように:

[...] イベント サブシステムはメイン スレッドから呼び出される必要があります。

別のスレッドからイベントを投稿することは可能ですが、イベントキューはメインスレッドによってのみ処理できます。したがって、

  1. イベントがメイン スレッドで取得されていることを確認します。

    def receiving_inputs(self):
        while True:
            events = pg.event.get()
            for event in events:
                ...
    ログイン後にコピー
  2. スレッドを作成して、イベント:

    def move(self, move):
        ...
    
    thread = threading.Thread(target=self.move, args=(move,))
    thread.start()
    ログイン後にコピー

以上が`pygame.event.get()` が別のスレッドでイベントを返せないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート