Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapakah `pygame.event.get()` Gagal Mengembalikan Acara dalam Benang Berasingan?

Mengapakah `pygame.event.get()` Gagal Mengembalikan Acara dalam Benang Berasingan?

Patricia Arquette
Patricia Arquetteasal
2024-12-01 11:54:13710semak imbas

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

pygame.event.get() Gagal Mengembalikan Acara dalam Thread Terpisah

Pertanyaan ini berkaitan dengan kesukaran yang dihadapi semasa menggunakan pygame.event .get() dalam urutan berasingan untuk mengurus input pengguna dalam permainan yang diilhamkan oleh Pac-Man. Coretan kod yang bertanggungjawab untuk menerima input adalah seperti berikut:

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

Apabila kod ini dilaksanakan, menekan kekunci papan kekunci tidak mencetuskan sebarang peristiwa, manakala menggerakkan tetikus akan mengembalikan peristiwa. Menariknya, kod yang sama berfungsi dengan sempurna apabila dilaksanakan dalam gelung utama program dan bukannya utas yang berasingan.

Persoalannya berpunca daripada keinginan untuk meminimumkan kejadian penekanan kekunci tidak didaftarkan dalam gelung utama dengan menggunakan utas yang berasingan .

Penyelesaian:

The tingkah laku yang tidak dijangka berpunca daripada fakta bahawa peristiwa mesti diuruskan dalam urutan utama. Seperti yang dinyatakan dalam dokumentasi thepygame.event:

[...] Subsistem acara harus dipanggil dari urutan utama.

Walaupun boleh menyiarkan acara dari urutan yang berasingan, acara itu baris gilir hanya boleh diproses oleh utas utama. Oleh itu,

  1. Pastikan acara diperolehi dalam urutan utama:

    def receiving_inputs(self):
        while True:
            events = pg.event.get()
            for event in events:
                ...
  2. Buat urutan untuk mengubah suai keadaan permainan berdasarkan acara:

    def move(self, move):
        ...
    
    thread = threading.Thread(target=self.move, args=(move,))
    thread.start()

Atas ialah kandungan terperinci Mengapakah `pygame.event.get()` Gagal Mengembalikan Acara dalam Benang Berasingan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn