Как избежать состояния гонки X11 при многопоточности с помощью PyAutoGUI?Linux

Ответить
Anonymous
 Как избежать состояния гонки X11 при многопоточности с помощью PyAutoGUI?

Сообщение Anonymous »

Я использую сервер отображения X11. У меня есть скрипт Python, который использует PyAutoGUI для преобразования прикосновений к экрану в движение мыши и элементы управления. Пакеты, которые отправляют координаты (и другие) данные касаний, передаются по именованному каналу (fifo). Из-за этого мне нужно запустить функцию PyAutoGUI в потоке, которая проверяет, истекло ли время ожидания последнего пакета и поэтому мышь должна подняться (это необходимо для определения между касанием и перетаскиванием, а также для завершения перетаскивания).
Чтобы программа работала плавно, мне нужно установить:

Код: Выделить всё

pyautogui.PAUSE = 0
Однако это, по-видимому, вызывает состояние гонки между pyautogui и сервером X11, поэтому программа аварийно завершает работу, когда получает неожиданный ответ:

Код: Выделить всё

RuntimeError: Expected reply for request 833, but got 834.  Can't happen!
Вот соответствующий код:

Код: Выделить всё

import time
import threading
import Xlib.threaded # this is to make the Xlib dependency of pyautogui threadsafe
import pyautogui as pag
pag.FAILSAFE= False
pag.PAUSE = 0

PIPE_PATH = "my path to named pipe"

screenWidth, screenHeight = pag.size()

global first_touch
first_touch = True
global previous_time
previous_time = None

def touch_timeout() -> None:
global first_touch
global previous_time

while True:
if previous_time != None:
while True:
local_time = time.time()
if local_time - previous_time > 0.01:
pag.mouseUp() # error appears here
first_Touch = True

timeout_thread = threading.Thread(target=touch_timeout)
timeout_thread.start()

with open(PIPE_PATH, "r") as f:
while True:
for message in f:
previous_time = time.time()

# packet handling logic here ...
# ...

pag.moveTo(xcoord, ycoord)
if first_touch:
pag.mouseDown()
first_Touch = False
Вот что я попробовал:
  • Я отключил поток (что лишает возможности перемещения мыши вверх, но для этого теста это подходит). Это привело к отсутствию ошибок и плавной работе.
  • Я настроил pag.PAUSE на различные значения. Все значения, отличные от 0, работают слишком медленно и не обеспечивают требуемой производительности. Однако чем выше значение, тем реже возникает указанная ошибка.


Подробнее здесь: https://stackoverflow.com/questions/799 ... -pyautogui
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»