Luồng chạy và thực thi

Luồng chạy và thực thi

Lời gọi thông thường chạy trong luồng hiện tại và có thể chờ chụp, xử lý, cử chỉ, chuyển UI hoặc nhập liệu. parallel của lần chạm và Flow.start là hai cơ chế khác nhau. Blocking là chờ trong luồng gọi, không đồng nghĩa UI Android bị treo.

Luồng nền

Flow.start(name, params=None) mở nhánh cô lập và trả số thứ tự Int. Mỗi lượt Run có tối đa hai nhánh nền. Không có Flow.stop(), pause(), resume(), join() hay API handle. Kết thúc luồng chính chờ các nhánh nền; lỗi ở một nhánh và System.stop() dừng toàn bộ lượt Run.

# Cấu hình luồng macro tên watch_enemy trước khi chạy
ordinal = Flow.start("watch_enemy", {"task": "status"})
print(ordinal)

Trạng thái dùng chung

Dùng giá trị/builder có thể thay đổi riêng cho mỗi luồng. Storage được chủ động dùng chung và khóa từng thao tác, gồm chỉnh sửa lồng nhau được theo dõi. Storage.get() rồi Storage.set() không nguyên tử; dùng một luồng ghi cho việc đọc-sửa-ghi. Chụp màn hình và điều khiển cache cũng dùng chung; đổi thiết lập ảnh hưởng mọi nhánh.

Lần chạm xếp hàng

parallel=True xếp hàng lần chạm; ngoài collect, delay_before và delay_after vẫn chờ trong luồng gọi. Touch.collect() gom chạm để Touch.send(); Touch.wait() chờ hoàn tất. Cử chỉ dùng chung kênh nhập Android, không trở thành thiết bị độc lập. Hủy cử chỉ đang chạy cần Android 8 trở lên.

# Thu thập các lần chạm chồng lấp rồi chờ hoàn tất
Touch.collect()
click((300, 900), hold_ms=1500, parallel=True)
click((780, 900), delay_before=500, parallel=True)
Touch.send()
Touch.wait()

Nhận diện và chờ UI

Region.find* tìm sự xuất hiện; Region.wait* chờ biến mất. Nhận diện một lượt vẫn tốn thời gian xử lý. Tốc độ kiểm tra giới hạn 1–60 Hz. Prompt MacroPanel có tương tác được tuần tự và chờ người dùng. OverlayText do từng luồng sở hữu; off_all() chỉ giải phóng overlay của luồng đó, còn UI đi qua Android Main.