标题:如何在qws进程中,关闭某个client进程?
作者:oceanljp
日期:2011-10-28 16:46
内容:
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命令去杀进程,会破坏qws与client间的信号量交互,所以想问下Qt有没有关闭client进程的接口。
#1 回 楼主(oceanljp) 的帖子 [wxj120bw 10-30 01:53]
参考QWSClient::deleteLater()函数手册
#2 [oceanljp 11-01 16:55]
试了楼上的方法,也是会出现类似的警告,而且在进程未启动的使用,使用deleteLater会发生segmentfault.
目前找一种变通的办法解决,直接上代码:
QWSWindow * window;
QWSClient * client;
int windowId;
int i;
for(i = 0; i < QWSServer::instance()->clientWindows().size() - 1; i++)
{
window = QWSServer::instance()->clientWindows().at(i);
windowId = window->winId();
client = window->client();
QWSWindowOperationEvent closeEvent;
closeEvent.simpleData.window = windowId;
closeEvent.simpleData.op = QWSWindowOperationEvent::Close;
client->sendEvent(&closeEvent);
}
简单描述就是:在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)
#3 回 2楼(oceanljp) 的帖子 [wxj120bw 11-02 06:11]
segmentfault 这个一般是空指针抱得错 其实想问为什么要关闭client进程 而不去关闭server进程
#4 回 3楼(wxj120bw) 的帖子 [oceanljp 11-02 09:00]
因为server进程还要继续运行,处理别的一些事情。