2015-05-14 6 views
1

Я хочу создать простой виджет Qwt, содержащий только циферблат. Значение, отображаемое на циферблате (т. Е. Положение диска), должно обновляться в соответствии с некоторыми входными данными, которые я собираю из отдельного потока.Qwt Realtime Dial

я могу генерировать свой диск в главном классе окна, и я могу создать и запустить свой сбор данных в отдельном потоке в пределах основного класса окна, как это:

MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) 
{ 
    // create the dial 
    QDial* pDial = new QDial; 

    // create the data class to capture data from an external source 
    DataClass* pData = new DataClass; 

    // start the data class thread 
    pData->Start(); 

    // I can get the latest value of data at any instant like this: 
    int x = pData->GetData(); 

    // I need to connect the data value to the dial, so that the 
    // dial always displays the value of the data capture device. 

} 

Что я могу вставить, так что GetData() постоянно вызывается для обновления значения, отображаемого на циферблате?

ответ

1

Я разработал ответ - не знаю, если это лучший способ сделать это.

Просто передать указатель на циферблате в конструктор DATACLASS:

DataClass* pData = new DataClass(pDial); 

А в классе DATACLASS, включают в себя элемент QDial * и SetDialValue метод:

class DataClass 
{ 
public: 
    Position(QDial* pDial); 
    . 
    . 
    . 
    void SetValue(int x); 

private: 

    QDial* _pDial; 
    int _val; 
} 

Набор _pDial для указатель, переданный в конструкторе, а затем всякий раз, когда принимаются новые данные, обновите циферблат с помощью метода SetValue:

void DataClass::SetValue(int x) 
{ 
    _pDial->setValue(x); 

    return; 
} 

Я забыл блокировки мьютексов и т. Д. Для указателя pDial, но это, конечно, необходимо.

+0

*** Я забыл блокировку мьютекса и т. Д. Для указателя pDial, но это, конечно, необходимо. *** Я бы избегал мьютекса, используя сигналы и слоты. – drescherjm

+0

Почему? Разве я не хочу защищать общие переменные, пока я пишу им в отдельный поток? – user12066

+0

С помощью сигналов и слотов вы исключаете переменные, которые совместно используются в потоках. В этом случае вы должны сделать 'DataClass :: SetValue (int x)' слот. И класс, который обновляет значение, выдаст сигнал (подключенный к этому 'SetValue (int)), который устанавливает значение. Qt обнаруживает, что задействовано более 1 потока и отправляет сигнал с использованием очередного соединения. – drescherjm

 Смежные вопросы

  • Нет связанных вопросов^_^