我已经在Qt中实现了一个类来接收char输入并对它们进行过滤并返回有意义的char数组,并且这是在与原始线程不同的线程中完成的。QThread Char数组在两个线程之间传递后被破坏
这里的头文件:
class WorkerThread : public QObject
{
Q_OBJECT
QThread highspeedthread;
int bufferCounter=0;
public:
char buffer[260];
WorkerThread();
public slots:
void doWork(char parameter); // This is the function to do the filtering
signals:
void resultReady(char*); // Signal for when the result is made, It gets connected to HighspeedProcessor::handleresult
};
class HighspeedProcessor : public QObject
{
Q_OBJECT
QThread highspeedthread;
public:
HighspeedProcessor();
signals:
void process(char); // This is the function from which the cycle starts
public slots:
void handleResult(char*); // This gets the results back
};
而这里的定义:
void WorkerThread::doWork(char parameter)
{
buffer[bufferCounter] = parameter;
// Filters the input and fills the buffer
// Code omitted for easement
// ...
qDebug()<<"Before: "<<buffer;
emit resultReady(buffer); // Pass the buffer to HighspeedProcessor::handleResult
}
HighspeedProcessor::HighspeedProcessor() {
WorkerThread *worker = new WorkerThread;
worker->moveToThread(&highspeedthread);
connect(this, SIGNAL(process(char)), worker, SLOT(doWork(char)));
connect(worker,SIGNAL(resultReady(char*)), this,SLOT(handleResult(char*)));
highspeedthread.start();
}
void HighspeedProcessor::handleResult(char *parameter)
{
qDebug()<<"After: "<<parameter;
}
的的WorkerThread正在做的工作只是罚款和过滤结果完美,但问题是,当结果传递到HighspeedProcessor类中,char数组会混淆在一起。结果如下图所示:
Before: $CMDgFlushing FIFO
After: $CMDgFlushing FIFO�:�"��ά!���j�D��@�/�]%�i�����Rր�������y�r��<�F��!]�uh����q�=S�ߠ�"�M�d
Before: $CMDgFlushing FIFO
After: $CMDgFlushing FIFO
Before: $CMDgFlushing FIFO
After: $CMDgFlushing ��o���kj���q�9 ����^ou����
顺便说这是不会发生如此频繁,这意味着只有一次出的近100倍就得到混合等次它的确定。输入数据的速率也接近1Mb/s。难道我做错了什么?
编辑:这已经发生之前,我在我的代码中使用qDebug。所以,这不是使用qDebug的结果。
使用'QByteArray' *并将其作为值传递,而不是指针*。在Qt中不要使用'char []'和'char *'作为多线程的东西(除非你有特定的理由这样做,并且可以清楚地说明原因)。让Qt为你做这项工作。 – hyde
@hyde我没有具体的原因,但在我的代码中有15-20个其他函数使用char *和char []没有任何问题。所以我认为没有必要改变这一点。但我会尝试你的建议。谢谢。 –
当你在排队连接的Qt中发出一个原始指针时,你有两个指向同一个对象的副本。您需要以某种方式确保在没有人再使用它之前不会销毁指向的数据,*和*如果您有多个线程,那么您需要使用互斥锁来保护数据,如果它正在进行被修改。一般来说,在这种情况下,传递一些像QByteArray这样的Qt copy-on-write对象是非常容易的。 – hyde