나는 타이머를 사용하여 신호를 내보내고 새 데이터에 따라 UI를 업데이트하는 슬롯 기능을 호출합니다.타이머가 UI를 응답하지 않습니까?
나는 그 기능을 아주 짧게 실행할 시간을 계산했습니다. 타이머가 1000ms로 설정되면 UI가 매우 느리게 응답합니다.
그 기능을 스레드로 옮기려고했지만 많은 기능이 UI 클래스의 보호 된 값에 액세스해야하므로 어렵다고 생각합니다.
타이머를 다른 스레드로 옮기고 UI 클래스 (기본 창)에 업데이트 기능을 남겨 두겠다.하지만 도움이 될지 모르겠다.
타이머가 UI를 느리게하고 응답하지 않는 이유는 무엇입니까? 스레드가 가볍고 CPU 시간이 덜 소요됩니까? 이 문제를 어떻게 해결할 수 있습니까?
initTimer()
{
refreshTimer = new QTimer(this);
connect(refreshTimer, SIGNAL(timeout()), this, SLOT(refreshDisplay));
refreshTimer->start(1000);
}
새로 고침 슬롯 기능이라고 모든 1000MS :
void refreshDisplay()
{
ui->tableWidget->setUpdatesEnabled(false);
for(int queue_i = size_1, index = 0; queue_i >= 0; queue_i--, index++)
{
LogInfoItem* logItem = (LogInfoItem*)logDisplayQueue.at(queue_i);
QString BITS_str = bits2Hexs(logItem->BITS);
ui->tableWidget->item(index, 0)->setText(logItem->time);//time
ui->tableWidget->item(index, 1)->setText(logItem->name);//name
ui->tableWidget->item(index, 2)->setText(BITS_str);//BITS
if(queue_i == oldRowItemNo)ui->tableWidget->selectRow(index);
}
ui->tableWidget->setUpdatesEnabled(true);
Q_FOREACH(Page* p, PageInfoList)
{
p->refresh();
}
Q_FOREACH(IconLabel* icl, iconLabelList)
{
icl->refresh();
}
}
무엇 '새로 고침()는'않습니다 단지 내부의 데이터에 따라 UI의 아이콘과 텍스트를 변화하고 있습니다. 게다가, 나는 데이터를 정적으로 만들었지 만 여전히 그것을 고칠 수는 없다. (기능을 거의 테스트하지 않았습니다 ...)
일부 코드를 게시하거나 문제를 재현 할 수있는 샘플 코드를 작성할 수 있습니까? 내 생각 엔 타이머에 의해 트리거되는 UI 업데이트에 느린 논리가 있기 때문에 타이머가 다시 트리거되어 이벤트 큐가 만들어집니다. – Ankush
감사합니다 !!! 나는 그것을 편집했다. – Al2O3
잠시 후 UI가 느려지 나 즉시 느 립니 까? 'refreshDisplay()'에서 UI 업데이트 코드를 모두 제거하고 카운터를 표시하는 라벨을 업데이트하는 것으로 바꾸십시오. 이것은 UI 업데이트 코드가 지연을 일으키는 지 또는 문제가 다른 루틴이 CPU를 먹어 치우는 것과 같은지 알려줄 것입니다. –