我从Maya内部启动UI.如果UI尚未关闭,再次运行UI将完全冻结Maya(错误"事件循环已在运行")
在重新运行脚本之前手动关闭UI将阻止它冻结.但我想这不太实际.
有没有办法检测我正在尝试运行的UI是否已经存在?可能的力量关闭它?
我想将.exe文件(更具体地说是控制台应用程序)集中到第一次启动它的一个正常运行的程序,但是当第二次执行时(第一次存在)它可以将焦点转移到第一个启动的程序.Qt中有可能吗?
我在 Windows7 平台上使用 Qt5。
我的应用程序是某种 TCP 服务器,侦听端口 8002,所以我只想要它的一个实例。
为了防止我的应用程序出现多个实例,我使用(d)下面的代码(在 StackOverflow 上找到):
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QSharedMemory sharedMemory;
sharedMemory.setKey("TcpServer-Key");
if(sharedMemory.create(1) == false)
{
QMessageBox::warning(NULL, "Warning!", "Another instance already running!");
a.exit(); // exit already a process running
return 0;
}
...
Run Code Online (Sandbox Code Playgroud)
好吧,上面的代码以前工作得很好,直到我将 Qt 升级到 5.5.1。
现在,使用 Qt 5.5.1,我再也看不到警告消息框了!...当我尝试启动另一个实例时,正在运行的应用程序消失/停止并启动一个新应用程序!!!
请帮忙,我该怎么办?但不要告诉我切换回 Qt 5.4.x :(
备注:我忘了提到我在测试期间设置并使用了 msvc2012 编译器(不是 minGW,因为我无法为其构建 log4cxx)。
更新:这可能是与安装在该 PC(在办公室,即 McAfee)上的防病毒相关的问题吗?...现在我在家(AVG 防病毒和 MinGW 编译器和 log4cxx 已删除)并且我无法重现上述问题:(
我需要确保只运行一个我的C++应用程序实例.
使用Win API我该怎么做;
检索有关我当前应用程序的信息?
GetCurrentProcess()会给我一个处理我的应用程序,如何检索有关它的信息
检索用户的所有正在运行的进程的列表?
EnumProcesses()给出一个列表,但似乎需要预先分配的缓冲区,那么如何找出当前正在运行的进程数?
我需要将我的服务器的exe名称与正在运行的进程进行比较,如果找到多个,则会引发错误
注意:我不能使用任何boost库,我对使用a感兴趣mutex,在类似的帖子中看到.
我正在尝试创建一个单一实例Qt应用程序,我正处于这样的工作,但现在我想在启动第二个时关注已经启动的实例.QWidget :: find(g_hWnd)应该返回小部件,但它失败并在w-> show();崩溃;
有什么想法吗?
#pragma data_seg("Shared")
HWND g_hWnd = NULL;
#pragma data_seg()
#pragma comment(linker,"/section:Shared,rws")
int main(int argc, char *argv[])
{
if (g_hWnd)
{
QWidget* w = QWidget::find(g_hWnd);
w->show();
return 0;
}
else
{
QApplication a(argc, argv);
mainWindow w;
w.show();
g_hWnd = a.topLevelWidgets().at(0)->winId(); //or w.winId()?
return a.exec();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:我现在看到奇趣科技在LGPL下发布了QtSingleApplication类.