2016-12-27 101 views
0

我已经在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的结果。

+1

使用'QByteArray' *并将其作为值传递,而不是指针*。在Qt中不要使用'char []'和'char *'作为多线程的东西(除非你有特定的理由这样做,并且可以清楚地说明原因)。让Qt为你做这项工作。 – hyde

+0

@hyde我没有具体的原因,但在我的代码中有15-20个其他函数使用char *和char []没有任何问题。所以我认为没有必要改变这一点。但我会尝试你的建议。谢谢。 –

+2

当你在排队连接的Qt中发出一个原始指针时,你有两个指向同一个对象的副本。您需要以某种方式确保在没有人再使用它之前不会销毁指向的数据,*和*如果您有多个线程,那么您需要使用互斥锁来保护数据,如果它正在进行被修改。一般来说,在这种情况下,传递一些像QByteArray这样的Qt copy-on-write对象是非常容易的。 – hyde

回答

1

你的错误:

  • 您正在使用两个不同的线程缓存,但经过 只是一个指针,它是没有意义的。
  • 不保护读/写缓冲区
  • 甚至不需要使用任何线程安全的交换缓冲区,只需将QByteArray作为参数传递给线程之间的信号插槽即可。

例如:

QByteArray buffer; 

//... 
signals: 
    void resultReady(QByteArray); 
//... 

void WorkerThread::doWork(char parameter) 
{   
    buffer[bufferCounter] = parameter; 
    //... 
    emit resultReady(buffer); 
} 

void HighspeedProcessor::handleResult(QByteArray parameter) 
{ 
    qDebug() << "After: "<< parameter; 
} 
+0

它在使用qDebug之前已经被销毁了。我用它只是为了表明我从我的代码的特定点打印结果。 –

1

更改我的char *变量的QByteArray解决我的问题。不知何故,在使用相同指针缓冲区的两个线程之间发生了一些冲突。