主函数(main.cpp):
- int main( int argc, char **argv )
- {
-
- QApplication a( argc, argv );
-
- Brow *b= new Brow();
- b->show();
- QObject::connect(qApp, SIGNAL(lastWindowClosed()), qApp, SLOT(quit()));
- int resulte= a.exec();
- return resulte;
- }
主要的一个类(Brow.cpp)的构造函数(这是一个构造界面的类),Brow主要负责读入mythread线程保存的缩微图片
- Brow::Brow( )//QWidget *parent)
- {
- ...//省略
- mythread = new MyThread(...);//参数省略
-
- mythread->start();
- ...// 省略
- //其中一段代码是读取mythread线程保存的缩微图片
- //mythread->wait();//等待线程结束.
- }
线程类(Mythread.cpp),主要工作是负责读入原始图片,并对其转换为缩微图,然后保存在指定的"TH"目录下
- void MyThread::PreLoad()
- {
- QString s;
- QPixmap Thumbs;
- for(int p=0;p<t_dlist->Length();p++)//t_dlist是一个双向链表类对象.存储绝对路径和文件名
- {
-
- s= QString(t_dlist->Current());
- s = s.section( '/', -1 );//得到文件名
- QFile file(TH+s);
- if(!file.exists())
- {//文件不存在
- file.open(IO_WriteOnly);
- if(!Thumbs.load(t_dlist->Current()))
- qDebug("Can't Load Picture %s",t_dlist->Current());
- Thumbs = scale(PIC_WIDTH,PIC_HEIGHT,&Thumbs);//对图象进行转换,scale函数省略
-
- qDebug(TH+s);
- if(!Thumbs.save(&file,"JPEG")) //重点在这一行语句
- qDebug("Can't Save Picture");
-
- file.close();
- }
- else
- {//文件已经存在
- qDebug("File %s is exists!",t_dlist->Current());
- }
- t_dlist->Next();
- }
- qDebug("Finish PreLoad Picture!");
- };
现在的问题是,我在Brow构造函数中开始了这个线程,直到Brow的构造函数结束之前,这个线程可以很好的工作,但是一旦构造函数退出,进入QApplication的exec()中时,就会得到:
Xlib: unexpected async reply (sequence 0x73f)! 的错误
第一种情况:
如果在Brow中不注释掉 mythread->wait();这一行,等待线程执行完成,没有问题.但是并行性就没有了(进入不了QApplication的exec(),图形界面显示不了)
第二种情况:
注释掉 main.cpp中的mythread->wait(); 但是在MyThread.cpp中,把
- if(!Thumbs.save(&file,"JPEG"))
改为
- 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
多谢了