急求大家的帮助!!!!关于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。
[解决办法]