2017-09-11 15 views
0

================================ =======QProgressBar가 주 스레드에 의해 차단 되었습니까?

QProgressBar* pbar = new QProgressBar(this); 
pbar->setMinimum(0); 
pbar->setMaximum(0); 
pbar->show(); 
for (int i = 0; i < 10000; i++) { 
    qDebug() << "=====flag1======"; 
} 
pbar->close(); 

==================================== =======================

내가 ProgressBar를 때 qDebug() 메시지 바쁜 보여 싶어하지만 아무 효과가 없다는 QProgressBar이 차단되고 루프가 끝나면 닫습니다.

누구든지이 문제를 해결하는 방법을 알고 있습니까? 고맙습니다!

+2

'for' 루프에서'pbar-> setValue (i)'를 호출하면 안됩니까? 게다가 진행률 막대의 최대 값을 최소값 이상으로 설정해야합니다.이 값은 코드에서 모두 0입니다. – vahancho

+0

다음과 같이 유용 할 수 있습니다 : [메인 스레드가 사용 중일 때 Qt를 작동시키는 방법] (https://stackoverflow.com/questions/1386043/how-to-make-qt-work-when-main-thread-is) -busy) – Simon

+0

내가 무슨 뜻인지는 알지만, 정확한 진도 값을 원하지 않는다. 단지 루프 중에 바쁘다. –

답변

2

예 GUI가 차단되었으므로 10 000 시간이 오래 걸립니다. QThread http://doc.qt.io/qt-4.8/qthread.html을 사용하십시오.

void My_Thread::run() { 
    for (int i = 0; i < 1e4; i++) { 
     if (i % 100 == 0) { 
      emit UpdateProgressBar(i); 
     } 
    } 
} 



//In Your SLOT 
void MainWindow::UpdateProgressbar(int value) { 
    ui->progressbar->setValue(value); 
} 
+0

'QThread'를 사용하면 커다란 과용이다. –

1

UI가 나타나기 전에 루프에 의해 주 스레드가 잠기고 루프가 끝난 직후 UI가 업데이트됩니다. 진행률 표시 줄을 보려면 QApplication :: processEvents();를 추가하십시오. 루프 내부. 그것은 최선의 해결책은 아니지만 작동 할 것입니다.

1

표시 할 위젯을 알기 위해서는 이벤트 루프를 처리해야합니다. 메인 스레드를 완전히 제어 할 수 있으므로 이벤트 루프는 QProgressBar을 표시하고 업데이트 할 이벤트를 처리 할 수 ​​없습니다.

빨리 해결할 수있는 한 가지 방법은 루프에 추가하는 것입니다. QApplication::processEvents(); 이벤트 루프를 처리합니다. 전화 번호는 bar->setValue(i);입니다.

올바른 방법은 신호와 슬롯을 사용하는 비동기 프로그래밍입니다. 실제 문제에 대한 세부 정보를 제공하지 않았으므로 좋은 해결책을 제시 할 수 없습니다.