在两个线程之间传递后,QThread Char数组被破坏

时间:2016-12-27 11:20:56

标签: c++ arrays multithreading qt

我在Qt中实现了一个类来接收char输入并过滤它们并向我返回有意义的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����

顺便说一下,这种情况并没有如此频繁地发生,这意味着几乎只有一次它被混淆了,其他时候也没关系。此外,输入数据的速率几乎是1Mb / s。我做错了吗?

编辑:在我的代码中使用qDebug之前,这已经发生了。所以,这不是使用qDebug的结果。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

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