jbr*_*nan 5 macos qt qt-creator
每次我在Qt Creator中运行我的项目时,它都会旋转我的应用程序的另一个实例.我必须手动退出应用程序,否则我的Dock会快速完成.太痛苦了.有没有解决的办法?如果我再次运行应用程序时,我可以终止已经运行的版本,这将更有意义.可以这样做吗?
您可以使用共享内存来解决您的问题。当已经有一个正在运行的实例时,我已经使用这种方法不启动程序的另一个实例。实际上我已经实现了这个来实现所谓的单实例应用程序。
然而,您的情况与我的情况有点不同,您需要以某种方式从第二个应用程序向第一个应用程序发送信号以使其关闭。我认为你仍然可以使用QSharedMemory.
我为实现单实例应用程序所做的就是创建一个共享内存,以通用唯一的 id(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
Run Code Online (Sandbox Code Playgroud)
为了给你一个小小的提示,我的单实例代码如下
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...";
}
}
Run Code Online (Sandbox Code Playgroud)
祝你好运,不要忘记在这里分享你的解决方案;)
编辑:
如果放置一个函数指针或 Qt 信号然后触发它是不可能的(我希望不会),您可以将一个变量放入共享内存中,让我们保存正在运行的实例的数量,并在您的应用程序中定期(在线程中)检查它,如果大于1则关闭应用程序。
请注意这里的比赛条件!您可以通过放置每个实例生成的一对随机数和开始时间来避免竞争条件。因此,在关闭之前,您的应用程序会确保它是较旧的应用程序。前任:QPair<int, QDateTime>
| 归档时间: |
|
| 查看次数: |
1030 次 |
| 最近记录: |