Konkurensi dan eksekusi

Konkurensi dan eksekusi

Panggilan biasa berjalan dalam alur saat ini dan dapat menunggu capture, pemrosesan, gestur, UI, atau input pengguna. parallel pada sentuhan dan Flow.start adalah mekanisme berbeda. Blocking berarti menunggu di alur pemanggil, bukan membekukan UI Android.

Alur latar

Flow.start(name, params=None) memulai cabang terisolasi dan mengembalikan nomor urut Int. Satu Run memiliki maksimal dua cabang latar. Tidak ada Flow.stop(), pause(), resume(), join(), atau handle. Alur utama menunggu cabang latar; kesalahan cabang atau System.stop() menghentikan seluruh Run.

# Konfigurasikan alur makro bernama watch_enemy sebelum dijalankan
ordinal = Flow.start("watch_enemy", {"task": "status"})
print(ordinal)

Status bersama

Gunakan nilai dan builder yang dapat berubah secara terpisah di setiap alur. Storage sengaja dibagikan dan mengunci operasi tunggal serta perubahan bertingkat yang dilacak. Storage.get() lalu Storage.set() tidak atomik; gunakan satu penulis untuk baca-ubah-tulis. Capture dan cache juga dibagikan; perubahan memengaruhi semua cabang.

Sentuhan dalam antrean

parallel=True mengantrekan sentuhan; di luar collect, delay_before dan delay_after tetap menunggu di pemanggil. Touch.collect() mengumpulkan sentuhan untuk Touch.send(); Touch.wait() menunggu selesai. Gestur berbagi kanal input Android, bukan perangkat independen. Pembatalan gestur aktif memerlukan Android 8 atau lebih baru.

# Kumpulkan sentuhan yang tumpang tindih, lalu tunggu hingga selesai
Touch.collect()
click((300, 900), hold_ms=1500, parallel=True)
click((780, 900), delay_before=500, parallel=True)
Touch.send()
Touch.wait()

Pengenalan dan menunggu UI

Region.find* mencari kemunculan; Region.wait* menunggu hilangnya target. Pengenalan sekali pun memerlukan waktu pemrosesan. Laju polling dibatasi 1–60 Hz. Prompt MacroPanel interaktif diserialkan dan menunggu pengguna. OverlayText dimiliki alurnya; off_all() hanya melepas overlay alur tersebut, sementara UI melalui Android Main.