Как определить, что программа активна или выполняет операции (когда курсор в программе становится символом "часов")?

Как определить, завершила ли программа свою работу на питоне, повершелле или с++, чтобы узнать, выполнила ли она все действия, которые должна была сделать?
  • 13 февраля 2024 г. 9:28
Ответы на вопрос 4
В разных языках программирования могут быть разные способы определения активности программы и ее завершения. Приведу примеры для каждого из указанных языков:

1. Python:
- Для определения активности программы можно использовать функцию `time.sleep()` вместе с модулем `time`. Если выполнение программы останавливается на некоторое время, это может указывать на то, что она активна. Например:

```python
import time

# ... код программы ...

time.sleep(2)  # Приостановка выполнения программы на 2 секунды

# ... код программы ...
```

- Чтобы определить, завершила ли программа свою работу, можно использовать функцию `sys.exit()`. Если программа достигает точки, где вызывается эта функция, это означает, что выполнение программы завершилось. Например:

```python
import sys

# ... код программы ...

sys.exit()  # Завершение выполнения программы

# ... код программы ...
```

2. PowerShell:
- Для определения активности программы в PowerShell можно использовать функцию `Start-Sleep`. Если выполнение программы останавливается на некоторое время, это может указывать на то, что она активна. Например:

```powershell
# ... код программы ...

Start-Sleep -Seconds 2  # Приостановка выполнения программы на 2 секунды

# ... код программы ...
```

- Чтобы определить, завершила ли программа свою работу, можно использовать функцию `Exit`. Если программа достигает точки, где вызывается эта функция, это означает, что выполнение программы завершилось. Например:

```powershell
# ... код программы ...

Exit  # Завершение выполнения программы

# ... код программы ...
```

3. C++:
- Для определения активности программы в C++ можно использовать функцию `std::this_thread::sleep_for` из заголовочного файла `<thread>`. Если выполнение программы останавливается на некоторое время, это может указывать на то, что она активна. Например:

```cpp
#include <thread>
#include <chrono>

// ... код программы ...

std::this_thread::sleep_for(std::chrono::seconds(2));  // Приостановка выполнения программы на 2 секунды

// ... код программы ...
```

- Чтобы определить, завершила ли программа свою работу, можно использовать оператор `return` или функцию `exit` из заголовочного файла `<stdlib.h>`. Если программа достигает точки, где используется одна из этих конструкций, это означает, что выполнение программы завершилось. Например:

```cpp
// ... код программы ...

return 0;  // Завершение выполнения программы

// или

#include <stdlib.h>

// ... код программы ...

exit(0);  // Завершение выполнения программы

// ... код программы ...
```

Однако, стоит отметить, что указанные способы проверки активности программы и ее завершения могут быть некорректными в некоторых случаях или не сработать, если программа выполняет определенные длительные операции. В таких случаях, может потребоваться использование других методов синхронизации или воспользоваться отладочными инструментами, предоставляемыми разработчиками языков программирования.
Если программа об этом никак не сообщает - то никак и не проверить ))) 
В частном случае можно найти прогрессбар и смотреть его заполнение (WinAPI). Смотреть на часики не надо )))
Но какого то общего решения для оконных приложений тут не будет. Другое дело консольные утилиты )
- если вы не писали программу сами, то курсор обычно не меняется... 
- если на часы, а также упоминаете exel, похоже на пробу vba
... смотрите на предмет "зацикливания"
В общем случае не существует способов решить твою задачу. 

Если с архиваторами еще можно посмотреть на статистику нагрузки процессора процессом, и если она упала то считать что работа закончена, то с программами, не затрагивающими процессор этого не сделаешь (например загрузка файлов из интернета, тут даже по нагрузке на сеть не поймешь).

Курсор мог бы быть решением если одно но - он меняется только пока этот курсор находится строго над окном приложения, причем над его видимой частью, т.е. если приложение свернуть или оно будет загорожено другими окнами, то этого понять будет нельзя.
Можно написать библиотеку и вешать ее как hook на вызовы winapi SetCursor (для запуска приложения потребуется администраторские права а так же с высокой вероятностью в современных версиях win10-11 это уже будет не так просто сделать, по крайней мере я пользовался одним таким приложением minimize to tray и оно уже не работает), так же это не будет работать с windows store приложениями, а точнее те что написаны на .net и используют среду CLR.

Поэтому, для каждого приложения придется искать свой детектор их занятости.
Похожие вопросы