Как сделать чтобы программа не запускала процесс на каждый аргумент, а запускала один процесc на все аргументы?

Рейтинг: 1Ответов: 2Опубликовано: 30.07.2023

Я написал MP3 Player на QT C++ и забилдил его. Когда я выделяю аудио и перетаскиваю на .exe программы она обрабатывает каждое аудио(тоесть воспроизводит и тд), но когда я выделяю эти файлы и способом "открыть с помощью" и выбираю свою програму, у меня на каждое аудио открывается по процессу и обрабатывает только его. Мне же нужно, чтобы открывался только один процесс и обрабатывал эти аудио.

Этим кодом обробляю аргументы:

if (argc > 1)
{

    for (int i = 1; i < argc; ++i) {
        QString url = QString::fromLocal8Bit(argv[i]);
        w.addMediainPlaylist(url);
    }
    MainWindow::AudioPlayStatus status = MainWindow::THISorMAIN;
    w.PlayAudio(w.getPlaylist(),status);

}

Ответы

▲ 0Принят

В QT для этого предусмотрен специальный класс QtSingleApplication Для того чтобы быстро разобраться как он работает, предлагаю склонировать репозиторий примера выполнив команду:

git clone git://code.qt.io/qt-solutions/qt-solutions.git

Далее выполнить билд, у меня Linux, поэтому для Windows может слегка отличаться в папке qtsingleapplication запустил последовательно 3 команды:

  1. конфигурирование: ./configure
  2. создание мейкфайла: qmake
  3. билд: make

После чего перешел в папку qt-solutions/qtsingleapplication/examples/trivial/

Там содержится программа с GUI при первом запуске она отображает пустое окно с TextEdit а при повторных в TextEdit добавляются строки "Wake up!"

Делается это в main таким образом:

QtSingleApplication instance(argc, argv);  // получаем инстанс программы
if (instance.sendMessage("Wake up!"))      // тут можно прокинуть аргумент (?.mp3)
return 0;                                  // выходим не создавая второй инстанс

При первом запуске sendMessage не отрабатывает и мы не заходим в условие, но если экземпляр не закрыт то повторные запуски будут вести прямо в условие отсылая сообщение.

В общем случае процесс выглядит приблизительно так: в системе регистрируется уникальный объект который можно каким-то образом найти. При запуске экземляра проверяется есть ли такой объект если он есть то программа завершается, между запуском и выходом есть возможность обработать аргументы, таким образом запуск программы служит не открытию нового окна а передаче аргументов уже открытому инстансу. По такому принципу действуют многие программы в системе, ярким примером может выступать браузер.

Так же, возможно, пригодится эта ссылка https://evileg.com/ru/post/147/ в ней более подробно рассказывается о том что я написал выше.

▲ 0

Создай ярлык программы. В ярлыке укажи шаблон параметров вроде %I ( или типа того , уточню завтра) и тогда при перетаскивании на ярлык будет открываться один инстанс с несколькими параметрами. Тоже самое и с "открыть с помощью", но там шаблон под параметр нужно исправить в реестре.