Как переместить функцию в QThread?

У меня есть функция с именем refreshLogDisplay() в моем классе MainWindow, которая выполняет большую работу с пользовательским интерфейсом. Код в нем такой:

ui->tablewidget->setRowCount(100);
// ...     

Таким образом, функция имеет дело со многими защищенными свойствами класса MainWindow. Но я хочу переместить функцию в другой QThread. В этом QThread я хочу, чтобы цикл while вызывал «refreshLogDisplay» 500 раз в секунду. 500 раз в секунду очень важны, и я не хочу, чтобы какой-либо таймер делал это, потому что таймеры слишком медленные.

Я знаю только, как реализовать подкласс, наследующий QThread, который не может получить доступ к ui->tablewidget вещам. Существует функция QObject::moveToThread(), но она не похоже, чтобы помочь.

Любые хорошие предложения?


person Al2O3    schedule 19.10.2012    source источник
comment
Для начала проверьте частоту обновления вашего монитора. Это абсолютный максимум количества различных изображений в секунду, которые вы будете видеть. Если частота обновления монитора составляет 60 Гц, нет необходимости обновлять пользовательский интерфейс чаще, чем 60 раз в секунду.   -  person    schedule 19.10.2012
comment
Например, этот вопрос касается доступа к графическому интерфейсу из других потоков.   -  person    schedule 19.10.2012
comment
См. также это примечание о том, почему создание подкласса QThread — это то, что вам нужно делать только тогда, когда вы добавляете функции управления в QThread, которые еще не встроены (в отличие от методов, которые включают код, который фактически выполняется в другой ветке): blog.qt. digia.com/2010/06/17/вы-делаете-это-неправильно   -  person HostileFork says dont trust SE    schedule 19.10.2012
comment
Вы не можете работать с пользовательским интерфейсом в фоновом потоке. Вы можете решить, что делать в фоновом потоке, но фактические действия пользовательского интерфейса там выполнять нельзя. Изменение rowCount табличного виджета должно выполняться в потоке графического интерфейса, без всяких «если» и «но». Если это медленная часть программы, вам просто нужно выяснить, как делать это реже.   -  person cgmb    schedule 19.10.2012
comment
Что касается того, что сказал @ Slavik81, см. мой ответ здесь, чтобы узнать о тонкостях того, как даже если вы разделяете модель и виджет представления и используете блокировку для управления доступом к данным, это не работает: stackoverflow. ком/вопросы/9485339/   -  person HostileFork says dont trust SE    schedule 19.10.2012


Ответы (1)


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

void Whatever::increment(){i+=2;emit incremental();} 
void Default::Progress(){ui->tablewidget->setRowCount(i);}
void main(){ //do thread
connect(Whatever,SIGNAL(increamental()),this,SLOT(Progress()));}
person Amr Jer    schedule 22.03.2016