多进程暂停1个代码,而另一个代码处于活动状态?

0 人关注

我正在为一个点击游戏制作一个机器人,游戏中有广告在随机时间弹出。在下面的代码中,只要检测到这些弹出的广告,就会被驳回。然而,播放点击游戏的代码是有时间限制的,每当发现有广告时,它就会扰乱代码,使程序失败。 有没有人知道,只要ad()发现什么,就暂停play()中发生什么?

My code:

from pyautogui import * 
import pyautogui 
import time 
import keyboard 
import random
import win32api, win32con
from multiprocessing import Process
import sys
def ad():
    adloop = True
    while adloop:
        cross = pyautogui.locateOnScreen('image.png', confidence = 0.95)        
        if cross != None:
            print("Popup!")
        else:
            print("Checking for popups...")
def count():
    amount = 0
    count = True
    while count:
        amount += 1
        print(amount)
        time.sleep(1)
if __name__=='__main__':
        p1 = Process(target = ad)
        p1.start()
        p2 = Process(target = count)
        p2.start()
    
5 个评论
欢迎来到SO!如果你能展示一个有问题的行为的最小版本,帮助起来会容易得多。评论出来的存根很重要,游戏中的行为也很重要。谢谢。顺便问一下,你真的需要MP来做这件事吗,还是多线程就足够了?在线程中更容易分享状态,而且我想大部分的I/O都是阻塞性的等待睡眠,以及你用来与点击游戏的任何地方互动的东西(提示:请添加更多具体细节)。
The code I made is 200> lines now, I don't think pasting all that here is the way SO works, or is it? The program works besides the fact that popups cause my automated clicks to get interrupted, and it makes the program fail. The way I'm making the program click on different things is with pyautogui.
哎呀 -- 我忘记分享链接了。 最低限度的可重复的例子 .从该链接来看。"精简你的例子.... 从头开始重新启动。创建一个新的程序,只添加看到问题所需的内容。"你可能甚至不需要cookie点击器,只需要在某些条件下表现出有问题的行为的两个进程--你可以手动 "模拟 "一个广告或cookie接受横幅事件,以达到演示的目的。只要注意不要过度简化,这样你就可以推断出你回到你的原始问题的反应。
我做了一个最小化的程序来检测代码,而另一个程序每秒都在计数+1。每当有一个弹出窗口被程序1检查时,程序2应该停止计数。我在哪里可以分享它?
请写在帖子里。我应该能够复制/粘贴,运行代码,而不需要弄乱什么,看到问题,然后写出解决方案(如果我知道的话)。
python
multiprocessing
pyautogui
Bramsko
Bramsko
发布于 2021-08-26
1 个回答
Mark Tolonen
Mark Tolonen
发布于 2021-08-26
已采纳
0 人赞同

你可以用 Process.Event 作为一个标志。

注意, pip install pyautogui pillow opencv-python 是需要操作的。

import pyautogui
import time
from multiprocessing import Process,Event
def ad(e):
    adloop = True
    while adloop:
        cross = pyautogui.locateOnScreen('image.png', confidence = 0.95)
        if cross != None:
            print("Popup!")
            e.clear()
        else:
            print("Checking for popups...")
            e.set()
def count(e):
    amount = 0
    while True:
        e.wait()  # sleep process when event is clear.
        amount += 1
        print(amount)
        time.sleep(1)
if __name__=='__main__':
    # Create an event to share between the processes.
    # When set, the counting process will count.
    e = Event()
    e.set()
    # Make processes daemons, so exiting main process will kill them.
    p1 = Process(target = ad, args=(e,), daemon=True)
    p1.start()
    p2 = Process(target = count, args=(e,), daemon=True)
    p2.start()
    input('hit ENTER to exit...')

Output:

hit ENTER to exit...1
Checking for popups...
Checking for popups...
Checking for popups...
Checking for popups...
Checking for popups...
Popup!
Popup!
Popup!
Popup!
Popup!
Popup!
Popup!
Popup!
Checking for popups...
Checking for popups...