Как создать поток для класса, который наследуется QWidget? - PullRequest
0 голосов
/ 18 января 2012

Я хочу создать поток для класса, который унаследован от QWidget.На самом деле, я попытался с множественным наследованием с QThread, и это не удалось, и я хочу запустить определенную функцию-член, используя поток.Как мне этого добиться?У кого-нибудь есть идеи?

Ответы [ 3 ]

2 голосов
/ 18 января 2012

Вы можете использовать класс-оболочку, который реализует поток и вызывает метод вашего виджета:

class MyWidget : public QWidget
{ 
    [...]

    void threadMethod();
};

class MyThread : public QThread
{
    [...]

    MyThread( MyWidget* widget )
      : mWidget(widget)
    {
    }

    void run()
    {
       mWidget->threadMethod();
    }

    MyWidget* mWidget;
};

Однако вы не должны вызывать какие-либо методы QWidget в "threadMethod", так как GUI и, следовательно, виджетыпринадлежат «основному» потоку, а методы QWidget не являются потокобезопасными!

Вероятно, было бы лучше сохранить ваш виджет и код потока полностью разделенными.

0 голосов
/ 19 января 2012

Классы Qt, которые принадлежат модулю GUI, не являются реентерабельными. Они ДОЛЖНЫ запускаться из основного потока.

0 голосов
/ 18 января 2012

Одним из решений может быть использование вложенного класса, в котором вы будете передавать указатель на ваш обычный класс виджетов и все все необходимые вам методы из вложенного метода run.

...