qt2.2 多线程发送消息 QThread::postEvent postEvent qApp->postEvent QApplication qt 消息

1.线程是用pthread_create创建的,没有使用QT的QThread类,但可以使用QThread::postEvent静态方法:

/*QThread::postEvent() is differenct with qApp->postEvent()*/

#define QT_POST_EVENT(x,msg,buf,buf_len){/*take care use*/\
    if(x){\
        QCustomEvent *event = new QCustomEvent(msg);\
        if(event){\
            UI_FIFO_DATA_IN(buf,buf_len);\
            /*qApp->postEvent(x,event);*/\
            /*qApp->notify(x,event);*/\
            QThread::postEvent(x,event);\
        }else{\
            debug_error(#x " new event fails\n");\
        }\
    }else{\
        debug_error(#x " is null\n");\
    }\

}

QThread::postEvent与QApplication::postEvent是不同的,前者不仅将消息事件放入到队列,还唤醒UI线程去处理事件,而后者仅仅发送事件到对象,并没有去处理,可看qt源码得知。

所以在UI线程使用后者是可以,但是多线程使用QApplication::postEvent会发现,事件已经发送,可UI根本没有刷新,移动一下鼠标或是键盘,才会看到刷新,相比

windows的PostMessage和SendMessage,PostMessage更好使一些。


2.UI线程接收消息,覆盖QWidget的customEvent事件,msg要大于1024,其它被QT使用:

void tFrmFirst::customEvent(QCustomEvent *event)
{
#if 1
    debug_first("begin\n");
#endif
    int msg=event->type();
    switch( event->type() )
    {
        case QM_SHOW:
            Show();
            break;
        case QM_HIDE:
            Hide();
            break;
        case QM_HINT:
            CardHint();
            break;
        case QM_BASE_INFO:
            UpdateBaseInfo();
            break;
        case QM_ONLINE_STATUS:
            UpdateOnlineStatus();
            break;
        default:
            debug_error("tFrmFirst uncongnized tFrmFirst event=0x%x\n",msg);
            goto error;
            break;
    }

error:
    return;

}

3.QT2.2默认情况下没有编译QThread多线程库libqte-mt.so,google搜索qt2 编译libqte-mt ,有编译方法:

由于qtopia 2.2.0的makefile里的问题,你现在只能自己手动编译出支持thread的libqte-mt.so. 具体做法如下:

1. 按照手册上的步骤,用“build”或者"build-all"脚本做一次完整的qtopia 2.2.0的编译;

2. 在解压出来的qtopia-2.2.0-FriendlyARM目录下执行
$source setQteEnv

3. 进入qtopia-2.2.0-FriendlyARM/qt2目录,清除之前编译生成的文件然后手动配置qt embedded以支持multi-thread:
$cd qt2
$make clean
$echo yes |./configure -embedded -no-xft -qconfig qpe -depths 16,32 -system-jpeg -gif-thread

注意:上面configure后的参数是我自己的配置,可能与你的不同。configure之后的参数应该与你自己x86-qtopia或者arm-qtopia目录下的“build“脚本里的”echo yes | ./configure -qte“之后的参数保持一致, 只是在最后加上"-thread"

4. 上面的步骤执行后会在当前目录下产生src-mt.mk文件,用编辑器将其内容的最后一行”cd src; $(MAKE) clean“删除或注释掉;

5. 编译libqte-mt
$make src-mt

编译完成后将在qtopia-2.2.0-FriendlyARM/qtopia/lib目录下生成所期待的libqte-mt.so.*文件。用nm命令可以看到现在qt embedded中就已经加入了QThread支持.


使用此方法可以编译出libqte-mt.so库,但是重新编译出来的libqte.so库会报错,替换以前的就可以了。还没有找到原因。


4.一直没有理解QApplication::processEvents,在多线程使用它会有很多奇妙的问题,有时界面乱掉,有时程序跑飞,最后还是使用QThread::postEvent解决:

UI线程简单处理:

processEvents是处理未完成的事件或3秒钟后返回,

另一个方法是使用一个计时为0的特殊定时器(QT手册有说明),将会自动处理未完成的事件,处理完所有事件后,0定时器触发定时事件。

多线程还是使用QThread::postEvent更好

你可能感兴趣的:(多线程,UI,脚本,Build,qt,makefile)