跨线程信号槽,如何发送char *

时间:2015-02-01 04:29:26

标签: c++ multithreading qt signals-slots

我创建了一个简单的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。)

1 个答案:

答案 0 :(得分:4)

您遇到的问题与Qt,信号或多线程完全无关。

您创建的char*不会以空值终止,因此您无法将其用于期望char*为C字符串的函数(或运算符) - 它们依赖在null终止符上。您在控制台上看到的结果就是 - operator<<的{​​{1}}重载将打印出字符,直到遇到零。您在5个字符后打印存储在内存中的任何垃圾值(这是未定义的行为btw)。

如果您因任何原因想要坚持使用char*,并希望将其用于需要C风格字符串的函数,则必须将其置零。 (并注意释放它,这不会自动发生。)