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

Как определить, завершила ли программа свою работу на питоне, повершелле или с++, чтобы узнать, выполнила ли она все действия, которые должна была сделать?
  • 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);  // Завершение выполнения программы

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

Однако, стоит отметить, что указанные способы проверки активности программы и ее завершения могут быть некорректными в некоторых случаях или не сработать, если программа выполняет определенные длительные операции. В таких случаях, может потребоваться использование других методов синхронизации или воспользоваться отладочными инструментами, предоставляемыми разработчиками языков программирования.
Если программа об этом никак не сообщает - то никак и не проверить ))) <br/> В частном случае можно найти прогрессбар и смотреть его заполнение (WinAPI). Смотреть на часики не надо ))) <br/> Но какого то общего решения для оконных приложений тут не будет. Другое дело консольные утилиты )
- если вы не писали программу сами, то курсор обычно не меняется... <br/> - если на часы, а также упоминаете exel, похоже на пробу vba <br/> ... смотрите на предмет "зацикливания"
В общем случае не существует способов решить твою задачу. <br/> <br/> Если с архиваторами еще можно посмотреть на статистику нагрузки процессора процессом, и если она упала то считать что работа закончена, то с программами, не затрагивающими процессор этого не сделаешь (например загрузка файлов из интернета, тут даже по нагрузке на сеть не поймешь). <br/> <br/> Курсор мог бы быть решением если одно но - он меняется только пока этот курсор находится строго над окном приложения, причем над его видимой частью, т.е. если приложение свернуть или оно будет загорожено другими окнами, то этого понять будет нельзя. <br/> Можно написать библиотеку и вешать ее как hook на вызовы winapi SetCursor (для запуска приложения потребуется администраторские права а так же с высокой вероятностью в современных версиях win10-11 это уже будет не так просто сделать, по крайней мере я пользовался одним таким приложением minimize to tray и оно уже не работает), так же это не будет работать с windows store приложениями, а точнее те что написаны на .net и используют среду CLR. <br/> <br/> Поэтому, для каждого приложения придется искать свой детектор их занятости.
Похожие вопросы