我已經在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