argument of type 'void (main form::)()' does not match 'void (*)(int)'

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,调用时加上类

signal(SIGALRM,main_form::sigalrm_fn);
这样就可以在放到public中时不用加static,不过放到private中还是需要的!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

袁保康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值