• 5813阅读
  • 4回复

QT下读取IO状态后不能再显示到界面 [复制链接]

上一主题 下一主题
离线yaotong195
 

只看楼主 倒序阅读 楼主  发表于: 2009-01-26
— 本帖被 XChinux 执行加亮操作(2009-01-27) —
大家好,我碰到了个问题,困扰了我好几天,不知道怎么解决,大侠们能否给看一下
我以阻塞的方式读取IO按键状态(按键驱动中是以中断的方式来记录状态的)然后再显示到界面上,所以在程序中用了select系统调用,读取IO状态没有问题而且数据也是正确的,但在显示数据到界面的时候,程序却没有任何响应(此时点程序的其它部分也没有任何响应),但程序确实没有死,源代码如下:


#include "frmmain.h"

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/select.h>
#include <sys/time.h>
#include <errno.h>
#include <qvariant.h>
#include <qlabel.h>
#include <qpushbutton.h>
#include <qlayout.h>
#include <qtooltip.h>
#include <qwhatsthis.h>
#include <qstring.h>

void OpenDevice()
{
int button_fd=open("/dev/buttons",0);
if(button_fd<0)
    {
    perror("open device button");
    exit(1);
    }
while (1)
    {
    fd_set rds;
    int ret;
    FD_ZERO(&rds);
    FD_SET(button_fd,&rds);
    printf("waiting for keypress!\n");
    ret=select(button_fd+1,&rds,NULL,NULL,NULL);
    if(ret<0)
        {
        perror("select");
        exit(1);
        }
    else if(ret==0)
        {
        printf("Time out\n");
        }
    else if(FD_ISSET(button_fd,&rds))
        {
        int readret=read(button_fd,key_values,sizeof(key_values));
        if(readret!=sizeof(key_values))
            {
            if(errno!=EAGAIN)
                perror("read button");
            continue;
            }
        else
            {
            //showData();
            this->setCaption("llllllllllllllllllllllllllllppppp"); //没有正常显示,而且程序界面没有任何响应
            printf("key pressed!\n"); //可以正常显示
            }
        }
    }
close(button_fd);
}


离线hanxing30

只看该作者 1楼 发表于: 2009-02-01
多线程可以解决。
离线wd007

只看该作者 2楼 发表于: 2009-02-01
不太明白,帮问吧
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线roc496
只看该作者 3楼 发表于: 2009-02-01
这个问题有多种方式解决
由于响应过快,造成界面冻结
第一种:
在循环体或运行部分加入
qApp->processEvents();
语句
这样Qt会检查消息队列中是否有需要处理的消息
如果有就会先响应这个
这是最简单的方法
第二种:
多线程,
稍微麻烦点...
第三种:
使用0毫秒定时器
如:
#ifdef USER_TIME_EVENT
    timeId = startTimer();
#else
    do();
#endif

在应用部分你开启那个宏就好了
do()函数为你想执行的代码
离线yaotong195

只看该作者 4楼 发表于: 2009-02-01
谢谢两位楼主,我试试,看可不可以
快速回复
限100 字节
 
上一个 下一个