Qt Creator: закрыть предыдущий экземпляр приложения, прежде чем снова запускать? - PullRequest
5 голосов
/ 01 декабря 2011

Каждый раз, когда я запускаю свой проект в Qt Creator, он запускает еще один экземпляр моего приложения. Я должен вручную выйти из приложения, иначе моя док-станция заполняется довольно быстро. Какая боль. Это можно обойти? Было бы гораздо больше смысла, если бы при повторном запуске приложения я мог просто прекратить работу уже запущенной версии. Можно ли это сделать?

1 Ответ

1 голос
/ 02 декабря 2011

вы можете использовать разделяемую память для решения вашей проблемы.Я использовал этот подход, чтобы не запускать другой экземпляр моей программы, пока он уже запущен.На самом деле, я реализовал это для создания так называемого приложения с одним экземпляром.

Однако ваш случай немного отличается от моего, вам нужно как-то отправить сигнал из второго приложения в первое, чтобы закрыть его.Я думаю, что вы можете добиться этого поведения, используя QSharedMemory.

То, что я сделал для создания единственного экземпляра приложения, - это создание общей памяти с универсально уникальным идентификатором ( UUID ) в качестве ключа, и каждый раз, когда моя программа запускается, она блокируется,поэтому, если она уже заблокирована, моя программа понимает, что уже есть запущенный экземпляр и автоматически закрывается.

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

Поток должен быть примерно таким:

IN MAIN
   check if shared memory in use
      if yes
         fire the exit function via shared memory to close 1st app
      if no
         put the function pointer which will close the app when another instance come up

    do stuff

Чтобы дать вам небольшоеподсказка, мой код для одного экземпляра выглядит следующим образом

QSharedMemory shared(AppConstants::UUID); //Global variable

int main(){
// Ensure single instanse of App
if( !shared.create( 512, QSharedMemory::ReadWrite) )
{
    // QMessageBox msgBox;
    QMessageBox::critical(0, QObject::tr("App is already running!"), QObject::tr("App is already running!"), QMessageBox::Ok, QMessageBox::Ok);
    qCritical() << "Cevirgec is already running!";

    exit(0);
}
else {
    qDebug() << "App staring...";
}
}

удачи и не забудьте поделиться своим решением здесь;)

РЕДАКТИРОВАТЬ:

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

Следите за условиями гонки здесь!Вы можете избежать условий гонки, поместив пару случайных чисел, сгенерированных каждым экземпляром, и время начала.поэтому перед закрытием ваше приложение гарантирует, что оно старшее.Пример: QPair<int, QDateTime>

...