qt 应用程序中使用 close系统调用函数 注意问题
2012-08-21 11:15
399 查看
因qt QWidget有QWidget::close()函数,与系统调用函数close同名,这是qt设计不好的地方,因此在QWidget派生类函数中调用close系统调用就要使用全局域符号“::”。
当时我出问题的代码如下:
void ButtonWindow::mousePressEvent ( QMouseEvent * e )//鼠标单击事件响应
{
int i;
int bfd;
int rt;
std::cout << "mouse clicked!\n";
bfd = open("/dev/Buzzer", 0);
if (bfd!=-1)
printf("open '/dev/Buzzer success!'\n");
else
{
printf("open '/dev/Buzzer fail!'\n");
printf(strerror(errno));
return;
}
rt = close(bfd); //注意此处使用错误,未加全局域符号,默认调用ButtonWindow::close函数,应改为rt=::close(bfd)
printf("close:rt=%d\n", rt);
printf("close '/dev/Buzzer'!\n");
}
当时发现很奇怪,close函数总是返回1,与标准close函数返回值不符,且调用此句函数后,qt线程变为了僵尸线程。后来猛然发现qt QWidget有QWidget::close()函数,这也就能解释为什么qt界面没有了,并成为僵尸线程了。这个问题我找了一天多,最后总算找到了。在此做下记录,希望也能给遇到同样问题的朋友提供参考吧。
当时我出问题的代码如下:
void ButtonWindow::mousePressEvent ( QMouseEvent * e )//鼠标单击事件响应
{
int i;
int bfd;
int rt;
std::cout << "mouse clicked!\n";
bfd = open("/dev/Buzzer", 0);
if (bfd!=-1)
printf("open '/dev/Buzzer success!'\n");
else
{
printf("open '/dev/Buzzer fail!'\n");
printf(strerror(errno));
return;
}
rt = close(bfd); //注意此处使用错误,未加全局域符号,默认调用ButtonWindow::close函数,应改为rt=::close(bfd)
printf("close:rt=%d\n", rt);
printf("close '/dev/Buzzer'!\n");
}
当时发现很奇怪,close函数总是返回1,与标准close函数返回值不符,且调用此句函数后,qt线程变为了僵尸线程。后来猛然发现qt QWidget有QWidget::close()函数,这也就能解释为什么qt界面没有了,并成为僵尸线程了。这个问题我找了一天多,最后总算找到了。在此做下记录,希望也能给遇到同样问题的朋友提供参考吧。
相关文章推荐
- STM32使用freertos时在中断中调用系统函数的注意点
- php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
- stm32f 使用freertos时在中断中调用系统函数的注意点
- QT在linux环境下读取和设置系统时间(通过system来直接调用Linux命令,注意权限问题)
- php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
- php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
- lamp使用php处理上传文件,调用move_uploaded_file函数遇到目录写权限问题及解决过程
- php的crc32函数使用时需要注意的问题(不然就是坑)
- php的crc32函数使用时需要注意的问题(不然就是坑)
- 应用程序调试(一)————使用strace命令来跟踪系统调用
- 64位与32位系统中函数调用中寄存器使用规则
- 解决系统服务运行应用程序的权限问题]使用WTSGetActiveConsoleSessionId()的VISTA服务与桌面交互
- php的crc32函数使用时需要注意的问题(不然就是坑)
- Linux中应用程序如何使用系统调用syscall
- QT中spinbox的使用&获取系统时间&写槽函数
- php中使用exec,system等函数调用系统命令
- 调试使用了函数模块的程序时需要注意的一个小问题
- 使用Excel调用ABAP系统的函数
- C# 调用 C++ dll 函数 时传递字符串 需要注意的问题
- js使用立即调用的函数表达式创建局部作用域问题