Jikao1919
@Jikao1919 (直 ジカオ)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Pythonでマルチプロセス処理を実行中、プログラムが終了しない。

解決したいこと

画面の特定の座標を3秒に1回、永続的にクリックし続けるマクロを組んでいます。キーボード(エスケープキー)の押下を検知してプログラムを終了する機能を実装しようとしているのですが、プログラムが終了しません。お力添えいただければと存じます。

実行環境はWindows11、python3です。

発生している問題・エラー


エラーは特に出ていません。キーを押してもプログラムが終了しません。

該当するソースコード

StopSkip.py
import time
import MouseControll
import keyboard
from concurrent.futures import ProcessPoolExecutor

# クールタイム
time.sleep(3)

# クリック連打したい座標
coo = [832, 448]

# 実際にクリックプロセス
def myclick() :
    while True :
        # 座標を引数にとってクリックする関数
        MouseControll.mouse_controll(coo)
        # 3秒間隔で連打
        time.sleep(3)

# ボタン待ち受けプロセス
def btn_detc() :
    while  True:
        # ESCキーを押すまでクリックし続ける
        if keyboard.read_key() == 'esc' :
            ############# 問題の箇所
            # ここでプログラムを終了させたい
            exit()


# マルチプロセス開始!!!
if __name__ == '__main__' :
    with ProcessPoolExecutor(3) as executor :
        executor.submit(myclick)
        executor.submit(btn_detc)
Mousecontroll.py
import pyautogui

def mouse_controll(coo) :
    pyautogui.click(coo[0], coo[1])

自分で試したこと

VScodeのデバッグを行い、ボタン待ち受けプロセスの挙動を見てみました。その結果、exit()の行には問題なく到達しているようでした。しかし、exit()を実行しても、プログラムは特に反応がなく動いたままでした。また、import sysを実行後sys.exit()に書き換えてみたりもしましたが、解決に至りませんでした。

どうぞよろしくお願いいたします。

0

1Answer

を参考に(ものすごく雑ですが)書き換えてみました。

import time
import MouseControll
import keyboard
from concurrent.futures import ProcessPoolExecutor

# クールタイム
time.sleep(3)

# クリック連打したい座標
coo = [832, 448]

# 実際にクリックプロセス
def myclick() :
    while True :
        # 座標を引数にとってクリックする関数
        MouseControll.mouse_controll(coo)
        print("myclick")
        # 3秒間隔で連打
        time.sleep(3)

# ボタン待ち受けプロセス
def btn_detc() :
    while  True:
        # ESCキーを押すまでクリックし続ける
        if keyboard.read_key() == 'esc' :
            ############# 問題の箇所
            # ここでプログラムを終了させたい
            break


# マルチプロセス開始!!!
if __name__ == '__main__' :
    with ProcessPoolExecutor(3) as executor :
        executor.submit(myclick)
        future = executor.submit(btn_detc)
        while True:
            if not future.running():
                break
        for process in executor._processes.values():
            process.kill()
2Like

Comments

  1. @Jikao1919

    Questioner

    ご回答いただき大変ありがとうございます。
    自分の環境で動作を確認したところ、正常に動かすことができました。
    どうしてもエラーが修正できず、もうあきらめるしかないと思っていたのですが、実装できてよかったです。
    お忙しい中大変ありがとうございます。重ねてお礼申し上げます。

Your answer might help someone💌