我在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的结果。
答案 0 :(得分:1)
你的错误:
例如:
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解决了我的问题。不知何故,两个线程之间发生了一些冲突,它们使用相同的缓冲区指针。