Запуск приложения в фоновом режиме
вот у меня есть скрытые значки, это приложения запущенные в фоновом режиме как я понимаю.
вот у меня есть собранный exe файл из main.cpp. как мне сделать чтобы мое main.exe приложение не выключалось после нажатия на крестик, а так же оставалось в фоновых приложениях. Возможно мне нужно в c++ файле это реализовать? Приложение консольное
Отслеживать
задан 27 фев 2021 в 15:55
5 3 3 бронзовых знака
27 фев 2021 в 16:20
В зависимости от его действий, возможно стоит переделать приложение в сервис, управляемый без участия UI, а через панель Сервисов?
27 фев 2021 в 17:16
Если у вас приложение оконное, то в ответ на WM_CLOSE не разрушайте окно, а просто скрывайте — и приложение останется висеть в памяти. Чтобы добавить значок в трей, есть функция Win API: docs.microsoft.com/ru-ru/windows/win32/api/shellapi/…. Если приложение консольное, то можно сабклассить окно консоли и далее сделать с ним то же самое (но я этого не делал, так что насколько это сработает для консоли не скажу).
27 фев 2021 в 20:36
@LShadow77 можете сказать как скрывать приложение?)
2 мар 2021 в 10:32
@f211 Вызовом ShowWindow(hWnd,SW_HIDE). docs.microsoft.com/en-us/windows/win32/api/winuser/… Всё это легко гуглится.
3 мар 2021 в 13:45
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Вот, накатал пример. Должен работать (у меня работает), но если есть неточности или ошибки, пусть камрады поправят. При вводе ‘h’ скрывает консоль и размещает стандартную иконку приложения в трее (может появиться в скрытых значках панели). При двойном клике по иконке удаляет её из трея и снова отображает консоль. При вводе ‘q’ — выход. Как выяснилось, субклассить окно консоли, унаследованное от другого процесса, нельзя. По-этому для обработки событий от иконки в этом примере создаётся дополнительное невидимое окно.
#include #include #include #define WMU_TRAY_ICON_MESSAGE (WM_USER+1) #define CLASS_NAME "UnvisibleHandlerWin" LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); HWND g_hConWnd; bool g_bHidden = false; NOTIFYICONDATA g_niData; int main() < WNDCLASS wcl; HWND hWnd; HINSTANCE hInst; MSG msg; char c; g_hConWnd = GetConsoleWindow(); if (!g_hConWnd) return 1; hInst = GetModuleHandle(NULL); ZeroMemory(&wcl,sizeof(WNDCLASS)); wcl.lpfnWndProc = WndProc; wcl.hInstance = hInst; wcl.lpszClassName = CLASS_NAME; RegisterClass(&wcl); hWnd = CreateWindowEx(0,CLASS_NAME,"",0,0,0,0,0,NULL,NULL,hInst,NULL); if (!hWnd) return 1; ZeroMemory(&g_niData,sizeof(NOTIFYICONDATA)); g_niData.cbSize = sizeof(NOTIFYICONDATA); g_niData.uID = 0; g_niData.uFlags = NIF_ICON|NIF_MESSAGE; g_niData.hIcon = LoadIcon(NULL,IDI_APPLICATION); g_niData.hWnd = hWnd; g_niData.uCallbackMessage = WMU_TRAY_ICON_MESSAGE; fputs("Inputs:\n" " h - minimizing console to the system tray\n" " q - quit\n",stdout); while (true) < while (PeekMessage(&msg,hWnd,0,0,PM_REMOVE)) DispatchMessage(&msg); if (g_bHidden) continue; fputs(">", stdout); while (true) < c = getc(stdin); if ((c!=0xA)&&(c!=0xD)) break; >if (c=='h') < if (!Shell_NotifyIcon(NIM_ADD, &g_niData)) < fputs("Something wrong. Can't create the notification icon!\n",stdout); continue; >ShowWindow(g_hConWnd,SW_HIDE); g_bHidden = true; continue; > if (c=='q') break; fputs("Unknown input, try again!\n", stdout); > DestroyWindow(hWnd); return 0; > LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) < if (uMsg==WMU_TRAY_ICON_MESSAGE) < if (lParam==WM_LBUTTONDBLCLK) < Shell_NotifyIcon(NIM_DELETE, &g_niData); ShowWindow(g_hConWnd,SW_SHOW); SetForegroundWindow(g_hConWnd); g_bHidden = false; >> return DefWindowProc(hWnd,uMsg,wParam,lParam); >
Не удается запустить приложение в фоновом режиме на телефоне или планшете HUAWEI
Пользователь переключается между двумя открытыми приложениями, но второе приложение перезапускается. Чтобы устранить проблему, выполните следующие действия:
1. Освободите место в памяти для ускорения работы устройства
Откройте приложение Оптимизация / Диспетчер планшета и нажмите Оптимизация / Оптимизировать . После завершения оптимизации Диспетчер / Диспетчер планшета отобразит результаты и рекомендации по настройке. Следуйте инструкциям на экране, чтобы завершить настройку. Откройте приложение Диспетчер / Диспетчер планшета и нажмите Очистка . После завершения сканирования нажмите Очистить рядом с файлами, которые необходимо удалить. Удалите лишние файлы или приложения, которые редко используются, чтобы освободить как минимум 20% от общего объема памяти.
2. Проверьте следующие настройки, чтобы предотвратить закрытие приложения
- Разрешите приложению работать в фоновом режиме: откройте Настройки , найдите и откройте раздел Запуск приложений , отключите опцию Автоматическое управление для приложения и включите опцию Работа в фоновом режиме во всплывающем окне.
- Проверьте, не происходит ли закрытие приложение из-за работы функции оптимизации батареи: откройте Настройки , откройте раздел Оптимизация работы батареи , нажмите на опцию Запрещено , выберите опцию Все приложения , найдите приложения, которые не могут работать в фоновом режиме, и выберите опцию Запретить .
- Выключите функцию Режим энергосбережения : перейдите в Настройки > Батарея и выключите Режим энергосбережения .
- Следите за тем, чтобы устройство было подключено к сети: перейдите в Настройки > Батарея > Другие настройки батареи и включите опцию Подключение к сети, когда устройство в спящем режиме .
- Закрепите фоновое приложение: откройте нужное приложение, откройте экран недавно использованных приложений, проведите вниз по карточке приложения, чтобы закрепить его. Закройте фоновые приложения, которые вы не используете.
- Задайте настройки в разделе Для разработчиков: откройте Настройки , найдите и откройте раздел Для разработчиков , найдите опцию Лимит фоновых процессов и выключите ее, выберите опцию Стандартный лимит для параметра Лимит фоновых процессов .
3. Закройте фоновые приложения, которые вы не используете
Если в фоновом режиме одновременно работает слишком много приложений, памяти вашего устройства может быть недостаточно. В результате фоновые приложения могут принудительно закрыться. Рекомендуется закрыть фоновые приложения, которые вы не используете.
4. Проверьте, установлено ли стороннее приложение-диспетчер
Сторонние диспетчеры могут принудительно закрывать приложения. Удалите сторонние приложения-диспетчеры телефона и повторите попытку.
5. Проверьте наличие обновлений
- Перейдите в AppGallery или на официальный веб-сайт приложения, чтобы обновить приложение до последней версии.
- Некоторые приложения поддерживаются только определенными версиями системы. Рекомендуется обновить систему до последней версии.
6. Если проблема не устранена
Проблема с принудительным завершением работы приложений, работающих в фоновом режиме, часто встречается в системе. Если приложение работает в фоновом режиме в течение длительного времени, системный механизм перехода в спящий режим и механизм энергосбережения приложения будут работать вместе, чтобы завершить работу приложения в фоновом режиме. Huawei продолжит работать над решением этой проблемы. Благодарим за понимание.
Screen — запускаем приложения в фоновом режиме
Screen — утилита позволяющая запускать приложения в фоновом режиме. Данная утилита полезная тем, что вы можете запустить любой процесс и отключиться от SSH сессии, а процесс продолжит выполняться.
Установка утилиты screen
sudo apt-get install screen
yum install screen
Для запуска утилиты достаточно выполнить команду screen после чего вы сразу же попадете в виртуальный терминал. В том случаи если вы используете сразу несколько виртуальных терминалов, будет правильнее, присваивать имя каждому из терминалов чтобы не запутаться.
Для задании имени виртуального терминала нужно выполнить команду с ключом -S
screen -S filecopy
После выполнения команды вы подключитесь в виртуальный терминал с именем filecopy и можете приступать к работе.
Для отключения от терминала ( запущенная программа продолжит свою работу ) нужно нажать Ctrl+A+D после этого вы попадете в основной терминал.
Для подключения к вашему созданному виртуальному терминалу выполните команду
screen -x имя_терминала
Либо если у вас создан всего один терминал
screen -r
Просмотреть список запущенных терминалов можно командой
screen -ls
Полный список команд доступен по команде
man screen
Запуск программ в фоновом режиме на Linux
При работе в ОС семейства Linux бывают случаи, когда необходимо запустить некий долгий процесс, например поиск файла, и при этом вернуться к работе в консоли. Вполне разумным решением будет открыть несколько терминалов и выполнить каждую задачу индивидуально, но что если мы не ищем легких путей? В этом случае разумным было бы запустить процесс в фоновом режиме. Рассмотрим как это сделать двумя способами.
Для начала следует разобрать синтаксис командной строки. Запуск одной программы/скрипта и т.д. выполняем явным указанием, например:
ping 10.10.0.1
/home/admin/scripts/script.sh
Для запуска одной программы по завершении другой используется логический оператор && (двойной амперсанд), например:
mysqldump mybase -u user1 > db.sql && tar zcvf db.tar db.sql
Не очень удачный пример, так как можно было использовать перенаправление “|”, приблизительно это выглядело бы так:
mysqldump mybase -u user1 | tar -cvf db.tar —
Все эти примеры замечательны для использования в скриптах, однако запуск “долгих” процессов сделает терминал недоступным, как это было отмечено выше. В этом случае поможет следующий пример:
find / -iname “*.txt” > abc.list &
Именно одинарный & в конце строки, указанный через пробел.
Как видно, первая строка запускает процесс, но так как в системе мало txt-файлов, процесс завершается. Последующее нажатие Enter в терминале сообщает, что процесс успешно выполнен.
Рассмотрим другой вариант. Воспользуемся утилитой ping, результаты будем писать в файл.
Ввиду отсутствия ограничительных параметров у данной команды, ее выполнение прервется когда закончится место на жестком диске.
Завершение процесса через killall покажет что процесс не завершился самостоятельно, а был “убит”.
Контролировать фоновые процессы, в данном случае, можно командой:
Сама команда jobs покажет сколько процессов выполняется и что именно выполняется, но различные ключи помогают отобразить больше информации. Ключ -l покажет еще и системный идентификатор процесса (PID). Ключ -p выведет только PID’ы, без описания.
Для перехода в приоритетный режим можно использовать команду fg 1 или %1.
Воспользоваться утилитой-мультиплексором screen. В некоторых дистрибутивах требуется установка.