我创建了一个简单的Qt GUI应用程序,并且我使用工作线程和工作线程在其中创建了一个简单的线程(参见下面的代码,它是一个将在大型程序中使用的简单代码)。
在我按下按钮的程序中,创建并启动线程,然后向线程发送包含要读取的文件名的char *
。但是当我发送例如字符串“salam”时,它会显示额外的字符,并且无法打开文件(在控制台中):
"filename=salam▬»
ìax↔↑♂"
为什么会这样?
MainWindow.cpp:
void MainWindow::on_pushButton_clicked()
{
Worker *worker = new Worker;
worker->moveToThread(&workerThread);
connect(&workerThread,SIGNAL(finished()),
worker, SLOT(deleteLater()));
connect(this, SIGNAL(operate(char *,int)),
worker, SLOT(doWork(char *,int)));
workerThread.start();
char *name=new char[5];
name[0]='s';name[1]='a';name[2]='l';name[3]='a';name[4]='m';
emit operate(name,5);
//vec=new QVector<double>();
}
worker.cpp:
void Worker::doWork(char *fileName,int size){
cout<<"filename="<<fileName<<endl;
}
worker.h:
class Worker : public QObject
{
Q_OBJECT
QThread workerThread;
public :
Worker();
public slots:
void doWork(char *fileName,int size) ;
};
#endif // WORKER_H
(如果要测试,请不要忘记在.pro文件中添加CONFIG + = console。)
答案 0 :(得分:4)
您遇到的问题与Qt,信号或多线程完全无关。
您创建的char*
不会以空值终止,因此您无法将其用于期望char*
为C字符串的函数(或运算符) - 它们依赖在null终止符上。您在控制台上看到的结果就是 - operator<<
的{{1}}重载将打印出字符,直到遇到零。您在5个字符后打印存储在内存中的任何垃圾值(这是未定义的行为btw)。
如果您因任何原因想要坚持使用char*
,并希望将其用于需要C风格字符串的函数,则必须将其置零。 (并注意释放它,这不会自动发生。)