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更好