2012-10-16 4 views
1

나는 타이머를 사용하여 신호를 내보내고 새 데이터에 따라 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의 아이콘과 텍스트를 변화하고 있습니다. 게다가, 나는 데이터를 정적으로 만들었지 만 여전히 그것을 고칠 수는 없다. (기능을 거의 테스트하지 않았습니다 ...)

+1

일부 코드를 게시하거나 문제를 재현 할 수있는 샘플 코드를 작성할 수 있습니까? 내 생각 엔 타이머에 의해 트리거되는 UI 업데이트에 느린 논리가 있기 때문에 타이머가 다시 트리거되어 이벤트 큐가 만들어집니다. – Ankush

+0

감사합니다 !!! 나는 그것을 편집했다. – Al2O3

+2

잠시 후 UI가 느려지 나 즉시 느 립니 까? 'refreshDisplay()'에서 UI 업데이트 코드를 모두 제거하고 카운터를 표시하는 라벨을 업데이트하는 것으로 바꾸십시오. 이것은 UI 업데이트 코드가 지연을 일으키는 지 또는 문제가 다른 루틴이 CPU를 먹어 치우는 것과 같은지 알려줄 것입니다. –

답변

1

고맙습니다. 나는 당신의 mehods를 사용했고, 결국 CPU 사용자를 찾았습니다. 그것은 setIcon 기능입니다. 전에 if 문을 추가하고 데이터가 변경되지 않으면 호출하지 않습니다. 모두들 감사합니다!

관련 문제