• 9003阅读
  • 4回复

[提问]如何在qws进程中,关闭某个client进程? [复制链接]

上一主题 下一主题
离线oceanljp
 

只看楼主 倒序阅读 楼主  发表于: 2011-10-28
Qt中是否有相关的接口?
尝试过使用linux下的kill杀进程,但总是会碰到一些信号量方面的问题
如下:

QWSLock::lock: Invalid argument
QWSLock::unlock: Invalid argument
QWSLock::unlock: Invalid argument


QWSSharedMemSurface: attaching to shared memory: Invalid argument
QWSSharedMemSurface: Error attaching to shared memory 0x18001

"QWSLock::QWSLock: No space left on device
Unable to create semaphore


猜测直接使用kill命令去杀进程,会破坏qwsclient间的信号量交互,所以想问下Qt有没有关闭client进程的接口。
离线wxj120bw

只看该作者 1楼 发表于: 2011-10-30
回 楼主(oceanljp) 的帖子
参考QWSClient::deleteLater()函数手册
离线oceanljp

只看该作者 2楼 发表于: 2011-11-01
试了楼上的方法,也是会出现类似的警告,而且在进程未启动的使用,使用deleteLater会发生segment  fault.
目前找一种变通的办法解决,直接上代码:

  1.     QWSWindow * window;
  2.     QWSClient * client;
  3.     int windowId;
  4.     int i;
  5.     for(i = 0; i < QWSServer::instance()->clientWindows().size() - 1; i++)
  6.     {
  7.         window = QWSServer::instance()->clientWindows().at(i);
  8.         windowId = window->winId();
  9.         client = window->client();
  10.         QWSWindowOperationEvent closeEvent;
  11.         closeEvent.simpleData.window = windowId;
  12.         closeEvent.simpleData.op = QWSWindowOperationEvent::Close;
  13.         client->sendEvent(&closeEvent);
  14.     }


简单描述就是:在qws进程中发送closeEvent给client进程,client进程接收closeEvent后关闭client所有窗体。而一般的Qt进程在所有窗体关闭后会结束进程。
不过这样就会出现一个缺陷,就是如果在client进程中设置“所有窗体关闭后,不退出进程”,那么qws进程就关不掉这个client进程了。


此外,这部分的代码用的接口并不属于Qt公开的API。我在使用这部分接口时,还单独将
qtransportauth_qws.h
qtransportauth_qws_p.h
qwscommand_qws.cpp
qwscommand_qws_p.h
从Qt源码中拷贝出来,并在程序中
#include "qwscommand_qws.cpp"


这样的解决办法有些“不正规”,当改用其他版本的Qt库时,不知会不会出问题。(ps:我用的Qt库是4.7.3)
离线wxj120bw

只看该作者 3楼 发表于: 2011-11-02
回 2楼(oceanljp) 的帖子
segment  fault 这个一般是空指针抱得错 其实想问为什么要关闭client进程 而不去关闭server进程
离线oceanljp

只看该作者 4楼 发表于: 2011-11-02
回 3楼(wxj120bw) 的帖子
因为server进程还要继续运行,处理别的一些事情。
快速回复
限100 字节
 
上一个 下一个