首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

急求大家的帮助!关于Qt多线程传递参数的有关问题

2012-05-29 
急求大家的帮助!!!!关于Qt多线程传递参数的问题我在Qt主线程中搜索文件夹中的视频文件,然后把视频文件的的

急求大家的帮助!!!!关于Qt多线程传递参数的问题
我在Qt主线程中搜索文件夹中的视频文件,然后把视频文件的的路径传给次线程,次线程是用于播放视频的,关键代码是这样:
这是主线程中的:
for( int i=0; i<avi_num; i++ )
  {
  videoName = static_cast<QString>(videonames.at(i));
  videoName_path = video_P + videoName; //获取单个视频的绝对路径
  qDebug() << "MainWindow::Check_folder -> " << videoName_path;

  PlayThread *playthread = new PlayThread( videoName_path );
  playthread->start();
  }

次线程的构造函数是:
 PlayThread::PlayThread(QString videoname)
{
  c_videofile = new char[200];
  memset(c_videofile,0,200);

  c_videofile = videoname.toLatin1().data();

  qDebug() << "PlayThread::PlayThread()::c_videofile ->" << c_videofile;
}
c_videofile 我是在头文件中定义的一个private 的char*格式

void PlayThread::run()
{
  qDebug() << "PlayThread started !";
  qDebug() << "PlayThread::run()::c_videofile ->" << c_videofile;

  detect_video( c_videofile ); //调用检测人脸,并保存

 }

现在的问题是,我在传递参数的时候,传递第一个视频路径时,在PlayThread::PlayThread()和void PlayThread::run()中显示没有出错,当传递第二个、第三个时,在PlayThread::PlayThread()中的c_videofile还可以和主线程的videoName_path一致,但是在void PlayThread::run()的c_videofile就可能出现乱码或者是空白

我纠结这个问题快一个星期了,希望大家帮帮我,谢谢。

[解决办法]
你把c_videofile换成线程内部的私有变量不行吗?
[解决办法]
你看看第一个路径和第二个路径有什么区别,会不会第一个路径没有中文,第二个路径有中文之类的。你把第一个路径传几次看看又没问题。
[解决办法]
> c_videofile = new char[200];
你确定长度足够?干嘛不直接用QString保存,需要的时候再转换呢?


> c_videofile = videoname.toLatin1().data();
你确定编码格式正确?
[解决办法]
个人也觉得用QString要好点,而且你这个 c_videofile 应该是个char * 吧,c_videofile = videoname.toLatin1().data();这样是赋址吗?
[解决办法]
> c_videofile = videoname.toLatin1().data();
应该早就注意到了。。。
这里toLatin1()会生成一个临时的QByteArray对象,在这句话执行完成后就销毁了
自然有时候就会出错了
[解决办法]
for( int i=0; i<avi_num; i++ )
{
videoName = static_cast<QString>(videonames.at(i));
videoName_path = video_P + videoName; //获取单个视频的绝对路径
qDebug() << "MainWindow::Check_folder -> " << videoName_path;

PlayThread *playthread = new PlayThread( videoName_path );
playthread->start();
}
这段代码会内存泄漏的,for循环内new出N个QThread,没有保存指针,new出的QThread除了最后一个其它的都找不到了,也没法delete。
[解决办法]

探讨
引用:
for( int i=0; i<avi_num; i++ )
{
videoName = static_cast<QString>(videonames.at(i));
videoName_path = video_P + videoName; //获取单个视频的绝对路径
qDebug() << "MainWindow::Check_folder -> " <<……

[解决办法]
QList <PlayThread> m_playThread;//这个你写到.h文件的类声明里面。
然后new一个就 m_playThread.append(playthread);
释放的时候 
for(int i = 0; i < m_playThread.count(); i++)

PlayThread &thread = m_playThread.at(i);
delete thread;
thread = NULL;
}
[解决办法]
探讨

引用:
> c_videofile = videoname.toLatin1().data();


应该早就注意到了。。。
这里toLatin1()会生成一个临时的QByteArray对象,在这句话执行完成后就销毁了
自然有时候就会出错了


那这个改为哪种比较的好呢?

热点排行