void main_form::main()
{
signal(SIGALRM,sigalrm_fn);
alarm(5);
while(1)pause();
}
void main_form::sigalrm_fn()
{
qDebug("alarm!\n");
}
就出现了这个问题,难道CPP中就没有办法使用alarm了吗?
在C中是没有问题的呀!!如下:
#include<stdio.h> //printf()
#include<signal.h> //signal()
#include<unistd.h> //pause()
#include<stdlib.h> //exit()
void sigalrm_fn(int sig)
{
printf("alarm!\n");
alarm(2);
return;
}
int main(void)
{
signal(SIGALRM, sigalrm_fn);
alarm(1);
while(1)
pause();
}
先搜一下吧:
①:
在类中使用signal编译不通过
答:signal的处理函数必须使用C声明的函数. 类的肯定不行, 不过可以试试static的静态类函数.
问:谢谢hotonline,用静态类函数确实可以,声明static void handle_signal(int s);就行了,不过为什么呢?hotonline可以解释一下吗? 小弟基础不好,烦请指教.
答:因为signal的处理函数只能有一个,否则的话就不知道到底要调用哪个函数了。
类的成员函数与类的个数相关,比如:定义CTest a,b,就会有2个void CTest::handle_signal(int s)。你编程序时希望类a调用a的handle_signal,类b调用b的handle_signal,但系统没这么聪明。说复杂点,其实以上的说法不完全正确,具体实现时,a和b的handle_signal地址是相同的,但隐藏了一个pThis的指针,使用single时,造成参数不统一。而static函数仅有一份,也不包含隐藏的pThis的指针参数。总而言之,single对应的必须是普通函数或static的类成员函数。
②:
How to get unix signals into Qt? (Embedded Linux)
#include <QSocketNotifier> class MyDaemon : public QObject { Q_OBJECT public: MyDaemon(QObject *parent = 0, const char *name = 0); ~MyDaemon(); // Unix signal handlers. static void hupSignalHandler(int unused); static void termSignalHandler(int unused); public slots: // Qt signal handlers. void handleSigHup(); void handleSigTerm(); private: static int sighupFd[2]; static int sigtermFd[2]; QSocketNotifier *snHup; QSocketNotifier *snTerm; };
我的解决方法记录:
1,加上static,并且要放到public中去,不然不行!
public: explicit main_form(QWidget *parent = 0); ~main_form(); static void sigalrm_fn(int);
总结:加上static是在①中学到的,放到public中是在②中学到的!/*不放到public中也行*/
2,调用时加上类
这样就可以在放到public中时不用加static,不过放到private中还是需要的!signal(SIGALRM,main_form::sigalrm_fn);