QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1059|回复: 3

关于kill sifgnal和QT一起用的问题!

[复制链接]
发表于 2005-7-2 17:32:48 | 显示全部楼层 |阅读模式
我有一个button,connect控制一个slot,在这个slot里我的代码是这样的
void closeForm::tppaintformslot()
{
   tppaintform.show();
   printf("before send signal\n");
   kill(parapid, SIGUSR1);
   printf("after send signal\n");
}
之后,我有一个子进程函数:
int flag;

void parainput()
{
int m=5;
int n;
signal(SIGUSR1, kinal);
printf("recieve signal!!!\n");
  
for(int i=0; i<m; i++)
{
   n=qblock-i*50;

   printf("n is %d\n",n);
   sleep(3);
  signal(SIGUSR1, kinal);
  printf("recieve signal!!!\n");
   printf("@^_^@killsignal is %d\n",flag);
   printf("one loop id end !!!\n");
    }
}
void kinal(int sig)  //重载这个信号
{
flag = 1;
printf("*^_^*killsignal is %d\n",flag);
}
现在的问题是,每次一运行,如果我点击这个,终端会出现
recieve signal!!!
@^_^@killsignal is 0
one loop id end !!!  //这个是我子进程在收到信号之前的显示,killsignal 是0
before send signal // 发射信号
*^_^*killsignal is 1 //信号的重载函数里输出
recieve signal!!!
@^_^@killsignal is 1  //子进程就监测到了,killsignal 是1了
one loop id end !!!
用户定义信号 1
[ztt@localhost mode8.3]$ recieve signal!!!  //这个时候我的界面就死在那里了
@^_^@killsignal is 1
one loop id end !!!//这样循环就结束了,界面自己关掉了

而且就停止在这里,什么都没有了,好郁闷,各位大侠帮我看看是哪里的错呀?我以前不用QT的时候用kill signal是可以的,现在就不可以了,为什么?是connect和slot的原因吗?我该怎么做呀!!!!!!!!!~>_<~
发表于 2005-7-2 18:40:19 | 显示全部楼层
虽然我不懂QT,但我想QT库对signal做了适合自己的定制,google了一下,找到了下面这篇文章,如果你有空翻译成中文,一定有很多人感谢你

http://affinix.com/~justin/signalsafety.html
回复

使用道具 举报

 楼主| 发表于 2005-7-5 09:06:22 | 显示全部楼层
我发现了诡异的原因,呵呵,我的父进程在fork之后,发送signal给子进程时,竟然给自己也发送了一个,(如果我在主进程里也接受这个信号,竟然可以接受到!!!)
倒!!!!!!!-_-!
还有一个问题,其实就是我的主进程也要接受这个信号也无所谓,大不了我对这个信号只是接受,什么都不做就可以了,可是,我发现我竟然不能在QT一个类对象里接受2个信号,如果接受,必定一个有要不屏蔽掉呢,怎么办???怎么办???~>_<~帮帮我!
回复

使用道具 举报

 楼主| 发表于 2005-7-5 10:10:36 | 显示全部楼层
我找到解决的办法了,虽然笨了点,但是还是有用的,呵呵,不要笑话我噢!把主进程中也接收一次信号,但不要放在一个类对象里,放在别的类对象里就好了,呵呵!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-5 17:21 , Processed in 0.066393 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表