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

Cross-thread signal slot, how to send char *

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

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

您正在创建的 char* 不是空终止的,因此您不能将它与期望 char* 是 C 字符串的函数(或运算符)一起使用 - 它们依赖于空终止符。您在控制台上看到的是结果 - char*operator<< 重载将打印出字符,直到遇到零。您正在打印 5 个字符后存储在内存中的任何垃圾值(顺便说一句,这是未定义的行为)。

如果您出于任何原因想要坚持使用 char*,并希望将它与需要 C 样式字符串的函数一起使用,则必须以零终止它。 (并注意释放它,这不会自动发生。)