主题 : 【已解决】学习QT2教程遇到的一个多线程qthread的问题? 复制链接 | 浏览器收藏 | 打印
大笑笑大
级别: 骑士
UID: 25314
精华: 8
发帖: 184
金钱: 1320 两
威望: 264 点
综合积分: 528 分
注册时间: 2010-07-22
最后登录: 2014-10-11
楼主  发表于: 2011-01-13 12:24

 【已解决】学习QT2教程遇到的一个多线程qthread的问题?

附件为现在学习qt的教程,
运行qthread-sinx里面的./build-x86.sh后出现以下问题:
[root@localhost qthread-sinx]# ./build-x86.sh
rm -f .obj/release-shared/moc_mainwindow.o .obj/release-shared/moc_sinthread.o .obj/release-shared/moc_trithread.o
rm -f .moc/release-shared/moc_mainwindow.cpp .moc/release-shared/moc_sinthread.cpp .moc/release-shared/moc_trithread.cpp
rm -f .obj/release-shared/main.o .obj/release-shared/mainwindow.o .obj/release-shared/sinthread.o .obj/release-shared/tirthread.o
rm -f *~ core *.core
g++ -c -pipe -DQWS -fno-exceptions -fno-rtti -Wall -W -Os  -DQTOPIA_DATA_LINKING -DQCONFIG=\"qconfig-qpe.h\" -DQTOPIA_TARGET=\"carbox\" -DQTOPIA_TRTARGET=\"carbox\" -DQT_NO_DEBUG -I/opt/FriendlyARM/mini2440/x86-qtopia/qtopia-2.2.0-FriendlyARM/qtopia/mkspecs/qws/linux-generic-g++ -I. -I/opt/FriendlyARM/mini2440/x86-qtopia/qtopia-2.2.0-FriendlyARM/qtopia/include -I/opt/FriendlyARM/mini2440/x86-qtopia/qtopia-2.2.0-FriendlyARM/qt2/include -I.ui/release-shared/ -I.moc/release-shared/ -o .obj/release-shared/main.o main.cpp
In file included from mainwindow.h:17,
                 from main.cpp:15:
sinthread.h:24: 错误:expected class-name before ‘{’ token
In file included from mainwindow.h:18,
                 from main.cpp:15:
trithread.h:24: 错误:expected class-name before ‘{’ token
make: *** [.obj/release-shared/main.o] 错误 1
[root@localhost qthread-sinx]#
是什么原因?
使用多线程是否可以在qtopia上直接使用
ret=pthread_create(&id,NULL,(void *)send, &data_send);
我使用上面这一句会出现:
main_form.cpp:100: 错误:对‘pthread_create(pthread_t*, NULL, void*, MainForm* const, mcpcan_data*)’的调用没有匹配的函数
对应的调用函数是要用类函数void MainForm::send(void *arg)   对应的写成ret=pthread_create(&id,NULL,(void *)send, this,&data_send);??
还是要用静态函数void send(void *arg)
[ 此帖被xphyym在2011-01-14 16:13重新编辑 ]
附件: qt教程.rar (581 K) 下载次数:1218
附件: qthread-sinx.rar (6 K) 下载次数:54
级别: 荣誉会员
UID: 34761
精华: 0
发帖: 1348
金钱: 6835 两
威望: 1367 点
综合积分: 2696 分
注册时间: 2010-12-21
最后登录: 2017-06-02
1楼  发表于: 2011-01-13 13:43
相关头文件包含了没
大笑笑大
级别: 骑士
UID: 25314
精华: 8
发帖: 184
金钱: 1320 两
威望: 264 点
综合积分: 528 分
注册时间: 2010-07-22
最后登录: 2014-10-11
2楼  发表于: 2011-01-13 15:16

 回 1楼(hacker) 的帖子

更改了pro文件里面的configure 的后面多加thread
根据http://www.aiothome.net/read.php?tid-2298-page-3-fpage-1.html
在x86上可以编译通过并运行,
但是在arm环境下还是编译不过,出现以下错误信息
/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/bin/ld: skipping incompatible /opt/FriendlyARM/mini2440/arm-qtopia/qtopia-2.2.0-FriendlyARM/qtopia/lib/libqte-mt.so when searching for -lqte-mt
/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/bin/ld: skipping incompatible /opt/FriendlyARM/mini2440/arm-qtopia/qtopia-2.2.0-FriendlyARM/qt2/lib/libqte-mt.so when searching for -lqte-mt
/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/bin/ld: cannot find -lqte-mt

从上面可以看到:qtopia/lib/的目录下有libqte-mt.so,但是没有找到  -lqte-mt,是否可以直接从qmake.conf里面删除-lqte-mt?

还有的是后面的问题,即如果直接用 pthread.h不用qthread.h的方法还是没有找到?
使用多线程是否可以在qtopia上直接使用
ret=pthread_create(&id,NULL,(void *)send, &data_send);
我使用上面这一句会出现:
main_form.cpp:100: 错误:对‘pthread_create(pthread_t*, NULL, void*, MainForm* const, mcpcan_data*)’的调用没有匹配的函数
对应的调用函数是要用类函数void MainForm::send(void *arg)   对应的写成ret=pthread_create(&id,NULL,(void *)send, this,&data_send);??
还是要用静态函数void send(void *arg)
[ 此帖被xphyym在2011-01-14 14:50重新编辑 ]
大笑笑大
级别: 骑士
UID: 25314
精华: 8
发帖: 184
金钱: 1320 两
威望: 264 点
综合积分: 528 分
注册时间: 2010-07-22
最后登录: 2014-10-11
3楼  发表于: 2011-01-14 14:50
由于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
注意这边:
对应arm-qtopia的命令为:
echo yes |./configure -embedded -no-xft -qconfig qpe -depths 16,32 -system-jpeg -qt-zlib -qt-libpng -gif -no-g++-exceptions -no-qvfb -xplatform linux-arm-g++ -tslib -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支持:
[ 此帖被xphyym在2011-01-14 16:13重新编辑 ]
大笑笑大
级别: 骑士
UID: 25314
精华: 8
发帖: 184
金钱: 1320 两
威望: 264 点
综合积分: 528 分
注册时间: 2010-07-22
最后登录: 2014-10-11
4楼  发表于: 2011-01-14 16:14
ret=pthread_create(&id,NULL,(void *)send, &data_send);
我使用上面这一句会出现:
main_form.cpp:100: 错误:对‘pthread_create(pthread_t*, NULL, void*, MainForm* const, mcpcan_data*)’的调用没有匹配的函数
对应的调用函数是要用类函数void MainForm::send(void *arg)   对应的写成ret=pthread_create(&id,NULL,(void *)send, this,&data_send);??
还是要用静态函数void send(void *arg)

解决方法如下:
使用的是静态函数,在头文件里面设置
static void send(void *arg)
在原文件里面
void MainForm::send(void *arg)
{
MainForm * q_send =(MainForm *)arg;//类型转换下
...
}
在调用的地方
ret=pthread_create(&id,NULL,send, &data_send);
战略很重要
级别: 侠客
UID: 12425
精华: 0
发帖: 60
金钱: 300 两
威望: 60 点
综合积分: 120 分
注册时间: 2010-01-06
最后登录: 2011-09-05
5楼  发表于: 2011-01-18 16:28
很是不错 试验下。。。
级别: 新手上路
UID: 40367
精华: 0
发帖: 31
金钱: 155 两
威望: 31 点
综合积分: 62 分
注册时间: 2011-03-17
最后登录: 2011-04-20
6楼  发表于: 2011-04-10 22:01
引用第3楼xphyym于2011-01-14 14:50发表的  :
由于qtopia 2.2.0的makefile里的问题,你现在只能自己手动编译出支持thread的libqte-mt.so. 具体做法如下:

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

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



还是不行啊  我还是没  -mt
g++   -o ./moc mocgen.o qbuffer.o qcollection.o qcstring.o qdatastream.o qdatetime.o qfile.o qgarray.o qgdict.o qglist.o qglobal.o qgvector.o qiodevice.o qregexp.o qstring.o qtextcodec.o qtextstream.o qutfcodec.o qfile_unix.o    -lm
qtextcodec.o: In function `realSetup()':
qtextcodec.cpp:(.text+0xeff): undefined reference to `QEucJpCodec::QEucJpCodec()'
qtextcodec.cpp:(.text+0xf13): undefined reference to `QSjisCodec::QSjisCodec()'
qtextcodec.cpp:(.text+0xf27): undefined reference to `QJisCodec::QJisCodec()'
qtextcodec.cpp:(.text+0xf43): undefined reference to `vtable for QEucKrCodec'
qtextcodec.cpp:(.text+0xf57): undefined reference to `QGbkCodec::QGbkCodec()'
qtextcodec.cpp:(.text+0xf73): undefined reference to `vtable for QBig5Codec'
qtextcodec.cpp:(.text+0xf8f): undefined reference to `vtable for QArabicCodec'
qtextcodec.cpp:(.text+0xfab): undefined reference to `vtable for QHebrewCodec'
qtextcodec.cpp:(.text+0xfc7): undefined reference to `vtable for QTsciiCodec'
collect2: ld 返回 1
make[1]: *** [moc] 错误 1
make[1]: Leaving directory `/home/QT/x86-qtopia/qtopia-2.2.0-FriendlyARM/qt2/src/moc'
make: *** [src-moc] 错误 2
级别: 新手上路
UID: 40367
精华: 0
发帖: 31
金钱: 155 两
威望: 31 点
综合积分: 62 分
注册时间: 2011-03-17
最后登录: 2011-04-20
7楼  发表于: 2011-04-11 15:23

 Re:回 7楼(wangzmfalcon) 的帖子

引用第8楼werookies于2011-04-11 10:18发表的 回 7楼(wangzmfalcon) 的帖子 :
引用http://www.aiothome.net/read.php?tid-2298-fpage-0-toread--page-4.html

已解决:将qt2/src/tools/qtextcodec.cpp改成下面的(虽然很简单,可能就是这样大家知道也不说,想了下,贴出来最好了)
#define QT_NO_EUCJPCODEC
2149 #ifndef QT_NO_EUCJPCODEC
.......




安装这个改了 有了  mt的库了 但是编译和执行程序的时候
/usr/bin/ld: warning: libqte.so.2, needed by /home/QT/x86-qtopia/qtopia-2.2.0-FriendlyARM/qtopia/lib/libqtopia2.so, not found (try using -rpath or -rpath-link)
[root@localhost thread]# ./run
Using display 0
/home/QT/x86-qtopia/thread/thread: error while loading shared libraries: libqte-mt.so.2: cannot open shared object file: No such file or directory


这个怎么解决 谢谢