2016-12-27 17 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解決我的問題。不知何故,在使用相同指針緩衝區的兩個線程之間發生了一些衝突。