2012-10-14 3 views
1

qt를 사용하여 네트워크에서받은 새 로그 항목을 보여주는 모니터를 개발합니다.
QTableWidget을 사용하면의 동적 항목을 표시 할 수 있으며 표에는 100 개의 행만 표시됩니다.
문제는 모니터가 초당 약 400 개의 메시지를 수신하고 행을 업데이트한다는 것입니다.
나는 setItem (행 안부, 항목)새로운 QTableWidgetItem()를는 사용하여 발견 확실히, 난 단지 BUTTOM 처음부터 최신 항목 (3 COLS 세 문자열)을 표시 할 시간이 많이 소요.
그러나이 방법은 실제로 시간이 많이 걸리는 반면, 한 번에 4000 개의 테스트 사례를 추가하면 5.281 초가 걸리고 4000/400 = 10 초가 걸립니다.
그래서 시간이 얼마나 걸리나요? qt 테이블 위젯을 사용하는 더 좋은 방법은 무엇입니까?;) 읽어 주셔서 감사합니다!
Qt 테이블 위젯 새로 고침을 최적화하는 방법은 무엇입니까?

filterLog 기능 코드 :

start = clock(); 
    filter_log_display(); 
    duration_filterLogDisplay += (double)(finish - start)/CLOCKS_PER_SEC; 

filter_log_display() : 시간에 대한

clock_t start = clock(); 
    row_selectable = false; 
    ui->tableWidget->setRowCount(0);//delete table items all 
    row_selectable = true; 

    int size_1 = logDisplayQueue.size() - 1; 

    ui->tableWidget->verticalScrollBar()->setSliderPosition(0); 

    if(size_1+1 < 100) 
    { 
     ui->tableWidget->setRowCount(size_1 + 1); 
    } 
    else 
    { 
     ui->tableWidget->setRowCount(100); 
    } 
    clock_t finish = clock(); 
    duration_setRowCount += (double)(finish - start)/CLOCKS_PER_SEC; 

    for(int queue_i = size_1, index = 0; queue_i >= 0; queue_i--, index++) 
    { 
     start = clock(); 
     LogInfoItem* logItem = (LogInfoItem*)logDisplayQueue.at(queue_i); 
     finish = clock(); 
     duration_getItemFQueue += (double)(finish - start)/CLOCKS_PER_SEC; 

     start = clock(); 
     QString BITS_str = bits2Hexs(logItem->BITS); 
     finish = clock(); 
     duration_bits2Hexs += (double)(finish - start)/CLOCKS_PER_SEC; 

     start = clock(); 
     ui->tableWidget->setItem(index, 0, new QTableWidgetItem(logItem->time));//time 
     ui->tableWidget->setItem(index, 1, new QTableWidgetItem(logItem->name));//name 
     ui->tableWidget->setItem(index, 2, new QTableWidgetItem(BITS_str));//BITS 
     finish = clock(); 
     duration_setItem += (double)(finish - start)/CLOCKS_PER_SEC; 

     start = clock(); 
     if(queue_i == oldRowItemNo)ui->tableWidget->selectRow(index); 
     finish = clock(); 
     duration_ifSelectRow += (double)(finish - start)/CLOCKS_PER_SEC; 
    } 

분석 : :)을 포함하여 최적화 할 수있는 많은 장소가있다이 하나 :)

enter image description here

답변

0

문제는 각 통화가 QTableWidget->setItem은 페인트 이벤트를 트리거합니다. a previous question에 대해 설명한대로 filter_log_display() 함수 내에서 UI 업데이트를 사용하지 않도록 설정할 수 있습니다.

또는 QTableWidget을 큐 주위의 QTableView 및 implement a table model으로 대체하십시오.

+0

탱크 !!! 방법은 너무 우아합니다, 나는 다른 방법으로 데이터를 업데이트하는 대신 함수를 호출하는 것을 피하려고했습니다. 결국 고맙습니다 !!! – Al2O3

관련 문제