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
Lepaskan: 2024-12-01 11:54:13
asal
708 orang telah melayarinya

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()
Salin selepas log masuk

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:
                ...
    Salin selepas log masuk
  2. Buat urutan untuk mengubah suai keadaan permainan berdasarkan acara:

    def move(self, move):
        ...
    
    thread = threading.Thread(target=self.move, args=(move,))
    thread.start()
    Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan