2011-11-11 39 views
11

Điều gì sẽ là cách tốt để giải quyết vấn đề sau trong Qt:Đường ống xử lý dữ liệu đa luồng trong Qt

Tôi có lớp cảm biến, liên tục tạo dữ liệu. Trên dữ liệu này, một số thao tác phải được thực hiện sau lần khác, có thể mất nhiều thời gian. Đối với điều này tôi có một số lớp học bổ sung. Về cơ bản, mỗi khi một mục dữ liệu mới được ghi lại, lớp đầu tiên sẽ nhận được dữ liệu, xử lý nó, chuyển nó sang phần tiếp theo và vân vân.

cảm biến -> lớp 1 -> ... -> lớp cuối cùng

tôi muốn đưa các lớp học cá nhân của các đường ống dẫn vào chủ đề của riêng mình, do đó lớp 1 có thể đã làm việc trên mẫu n +1 khi lớp 2 đang xử lý mẫu n ...

Ngoài ra, vì các bước riêng lẻ có thể khác nhiều về hiệu suất của chúng (ví dụ: cảm biến nhanh hơn phần còn lại) và tôi không quan tâm đến dữ liệu lỗi thời, muốn lớp 1 (và mọi thứ sau đó) để luôn nhận được dữ liệu mới nhất từ ​​người tiền nhiệm của họ, loại bỏ dữ liệu cũ. Vì vậy, không có bộ đệm lớn giữa các bước của đường ống. Trước tiên tôi đã nghĩ đến việc sử dụng Qt :: QueuedConnections cho tín hiệu/khe, nhưng tôi đoán rằng điều này sẽ giới thiệu một hàng đợi đầy các mẫu lỗi thời đang chờ xử lý bởi các phần chậm của đường ống?

Trả lời

3

Điều bạn đang giải quyết là Mẫu người tiêu dùng của nhà sản xuất. Bạn có thể tìm thấy tổng quan chung về điều đó tại đây. http://en.wikipedia.org/wiki/Producer-consumer_problem

Bạn muốn sử dụng QMutex để giới hạn quyền truy cập vào dữ liệu vào một luồng tại một thời điểm. Sử dụng QMutexLocker để khóa nó.

Đối với một ví dụ rất đơn giản:

QList<quint32> data; 
QMutex mutex; 

// Consumer Thread calls this 
int GetData() 
{ 
    quint32 result(-1); // if =1 is a valid value, you may have to return a bool and 
         // get the value through a reference to an int 
         // in the parameter list. 

    QMutexLocker lock(&mutex); 

    if (data.size()) 
    { 
     result = data.front(); // or back 
     data.clear(); 
    } 

    return result; 
} 

// Producer Thread calls this 
void SetData(quint32 value) 
{ 
    QMutexLocker lock(&mutex); 

    data.push_back(value); 
} 
5

Chỉ cần tạo lớp "xếp hàng" của riêng bạn. Nó cần phải có:

A piece of data (or pointer to data) 
A Boolean "dataReady" 
A mutex 
A condition variable 

Các "enqueue" chức năng chỉ là:

lock mutex 
Replace data with new data 
dataReady = true 
signal condition variable 

Các "dequeue" chức năng chỉ là:

lock mutex 
while (!dataReady) cond_wait(condition, mutex) 
tmpData = data 
data = NULL (or zero) 
dataReady = false 
unlock mutext 
return tmpData 

Các loại dữ liệu có thể là một mẫu tham số.

Các vấn đề liên quan