跨线程信号槽,如何发送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 样式字符串的函数一起使用,则必须以零终止它。 (并注意释放它,这不会自动发生。)
我创建了一个简单的 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 样式字符串的函数一起使用,则必须以零终止它。 (并注意释放它,这不会自动发生。)