• 6959阅读
  • 5回复

关于QThread的问题,请教大家 [复制链接]

上一主题 下一主题
离线xuangu
 

只看楼主 倒序阅读 楼主  发表于: 2006-04-15
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
主函数(main.cpp):
  1. int main( int argc, char **argv )
  2. {
  3.  
  4.   QApplication a( argc, argv );
  5.  
  6.   Brow *b= new Brow();
  7.   b->show();
  8.   QObject::connect(qApp, SIGNAL(lastWindowClosed()), qApp, SLOT(quit()));
  9.   int resulte= a.exec();
  10.   return resulte;
  11. }

主要的一个类(Brow.cpp)的构造函数(这是一个构造界面的类),Brow主要负责读入mythread线程保存的缩微图片
  1. Brow::Brow( )//QWidget *parent)
  2. {
  3.   ...//省略
  4.   mythread = new MyThread(...);//参数省略
  5.  
  6.   mythread->start();
  7.   ...// 省略
  8.   //其中一段代码是读取mythread线程保存的缩微图片
  9.   //mythread->wait();//等待线程结束.
  10. }

线程类(Mythread.cpp),主要工作是负责读入原始图片,并对其转换为缩微图,然后保存在指定的"TH"目录下
  1. void MyThread::PreLoad()
  2. {
  3.   QString s;
  4.   QPixmap Thumbs;
  5.   for(int p=0;p<t_dlist->Length();p++)//t_dlist是一个双向链表类对象.存储绝对路径和文件名
  6.   {
  7.    
  8.     s= QString(t_dlist->Current());
  9.     s = s.section( '/', -1 );//得到文件名
  10.     QFile file(TH+s);
  11.     if(!file.exists())
  12.     {//文件不存在
  13.         file.open(IO_WriteOnly);
  14.         if(!Thumbs.load(t_dlist->Current()))
  15.           qDebug("Can't Load Picture %s",t_dlist->Current());
  16.         Thumbs = scale(PIC_WIDTH,PIC_HEIGHT,&Thumbs);//对图象进行转换,scale函数省略
  17.        
  18.         qDebug(TH+s);
  19.         if(!Thumbs.save(&file,"JPEG"))   //重点在这一行语句
  20.           qDebug("Can't Save Picture");
  21.        
  22.         file.close();
  23.       }
  24.       else
  25.       {//文件已经存在
  26.         qDebug("File %s is exists!",t_dlist->Current());
  27.       }
  28.       t_dlist->Next();
  29.   }
  30.   qDebug("Finish PreLoad Picture!");
  31. };


现在的问题是,我在Brow构造函数中开始了这个线程,直到Brow的构造函数结束之前,这个线程可以很好的工作,但是一旦构造函数退出,进入QApplication的exec()中时,就会得到:
Xlib: unexpected async reply (sequence 0x73f)! 的错误
第一种情况:
  如果在Brow中不注释掉 mythread->wait();这一行,等待线程执行完成,没有问题.但是并行性就没有了(进入不了QApplication的exec(),图形界面显示不了)

第二种情况:
  注释掉 main.cpp中的mythread->wait(); 但是在MyThread.cpp中,把
  1. if(!Thumbs.save(&file,"JPEG"))

改为
  1. if(!Thumbs.load(t_dlist->Current()))

意思测试这个进程是否工作
将保存改为读入原始图片.结果是可以很好的进行.

第三种情况:
  在main.cpp中创建一个子进程,专门负责Mythread现在做的事,在Brow中不创建线程
但是还是失败,出现以上Xlib: unexpected async reply (sequence xxxx)!错误,

第四种情况:
  先写好一个程序(使用QT的若干类)preload,负责到指定目录读取原始图片,转换,存储到另一个指定目录(如/tmp/temp/),编译好这个程序,单独执行,可以很好的工作.然后在main.cpp里面创建一个子进程加入系统调用:system(./preload).结果还是和第三中情况一样.

我想了很久还是不得要领,希望大家帮我想想,这是为什么.
为什么在线程里面可以读不可以写.为什么即使是创建了进程还是会出现上述错误;
我的编程环境:
QT:3.3.6
OS:Fedora 5
G++:4.1.0
多谢了
离线xuangu

只看该作者 1楼 发表于: 2006-04-16
怎么没人理我阿,请大家帮帮我吧
离线billdates
只看该作者 2楼 发表于: 2006-04-19
可以把你的源程序都贴上来吗? 我不一定能帮忙但可以看一下
离线myer

只看该作者 3楼 发表于: 2006-04-19
Xlib: unexpected async reply 应该是多线程操作共享资源的同步问题
wait()语句注释后,gui线程和文件处理线程是并行的,可能出现文件IO问题
wait()后,就和一个线程差不多了
http://user.qzone.qq.com/56430808
离线xuangu

只看该作者 4楼 发表于: 2006-04-19
to myer:
我觉得应该不时文件IO的问题,因为即使我把 if(!Thumbs.save(&file,"JPEG"))
改为直接存储在内存的缓存里即改为:
  1.     QByteArray ba;
  2.     QBuffer buffer( ba );
  3.     buffer.open( IO_WriteOnly );
  4.     Thumbs.save( &buffer, "JPEG" );

这样了还是出现以上的错误.
离线xuangu

只看该作者 5楼 发表于: 2006-04-19
好了,我传了代码上来了,麻烦帮我看看,谢谢
[ 此贴被xuangu在2006-04-19 15:47重新编辑 ]
附件: show.zip (65 K) 下载次数:36
快速回复
限100 字节
 
上一个 下一个