QListView 아이템 추가, 삭제 업데이트 시 느려지는 문제점
글쓴이: kjh27814 / 작성시간: 금, 2013/07/26 - 10:49오전
안녕하세요.
ListView에 모델을 등록해서 사용하는 중인데
이게 4만개정도의 항목에 대해서는 입력 / 삭제가 그나마 빠른편입니다.
하지만 데이터가 10만개가 넘어가게 되면 데이터를 입력 / 삭제를 할 때 프로그램이 한창 굳어있다가
입력이 되거나 삭제가 됩니다.
데이터가 입력 될 때 마다 datachanged 함수를 부르는데 하나씩 입력할때는 해당 index에 대해서만 업데이트를 하고
여러개를 한번에 입력하면 시작 index와 종료 index에 대해 업데이트를 합니다.
thread를 이용해 보는 방법도 생각해봐서 구글에 찾아보니 모델의 data()함수가 GUI thread에서 밖에 동작하지 않아 thread화는 불가능하다고 나오더군요.
혹시 다른 해결방법 없을까요?
답변 부탁드리겠습니다.
Forums:
http://qt-project.org/doc/qt-
http://qt-project.org/doc/qt-5.0/qtwidgets/qlistview.html#uniformItemSizes-prop
이걸 써보세요.
답변 감사드립니다.
근데 여러개를 한번에 입력할 땐 빠른편인데 하나만 입력할때는 좀 느리네요 ㅜㅜ
무엇이 원인일까요?
setUniformItemSize()를 적용했더니
setUniformItemSize()를 적용했더니 그렇게 됬다는 뜻인가요?
그리고 하나를 삽입하는데 걸리는 시간이 10개를 삽입할때 걸리는 시간보다 길다는 뜻인가요?
아니면 하나를 삽입하는데 걸리는 시간이 10개를 삽립할때 걸리는 개당 평균시간보다 길다는 뜻인가요?
삽입알고리즘에 시간이 오래걸리는건지, GUI update에 오래걸리는건지 확인해보셨나요?
아이템을 삽입할 때, insertRows()를 이용하시나요? 그리고 삽입 전후에 beginInsertRows()와 endInsertRows()를 호출하시나요?
확인이 늦었네요.
답변 감사드립니다.
초기에 여러개를 삽입 한 후 그 다음부터 사용자가 하나씩 삽입하는 방식인데
초기에 여러개를 삽입하는 속도는 굉장히 빠릅니다.
근데 사용자가 하나를 삽입 할 때는 약간 딜레이가 있습니다.
아이템을 삽입 할 때는 insertrows()를 사용하고 있으며(오버라이딩 시켜서 내부에서 beginInsertRows()와 endInsertRows()를 호출합니다.)
초기에 여러개를 삽입 할 때나 하나를 삽입 할 때 쓰는 알고리즘은 똑같습니다.
알고리즘이 같고 다른거랑 상관없이, 실제로 시간을
알고리즘이 같고 다른거랑 상관없이, 실제로 시간을 측정해보세요.
더불어 모델클래스는 QAbstractItemModel을 이용하고 계신가요?
예전에 비슷한 문제에 처한 적이 있었는데, 모델의
예전에 비슷한 문제에 처한 적이 있었는데, 모델의 크기가 커지면 느려지더군요.
실제로 화면에 적게 표현이 되도, 내부적으로는 업데이트가 돌아가는 것 같았습니다.
그래서 다른 모델을 하나 더 두고, 리스트의 모델에서는 화면에 뿌려지는 것만 억세스 해서 불러오도록 고쳤습니다.
그런데, 그때는 Qt3였고, 이후에는 대용량을 리스트에 넣은적이 없어서, 지금도 그런지는 잘 모르겠네요.
답변 감사드립니다.
답변 감사드립니다.
약 400만개의 데이터를 기준으로
초기 400만개 데이터 삽입 시 3초, 그 이후 사용자가 데이터 삽입 시 10초 가량 걸립니다.
모델은 QStringListModel을 상속받아 사용하고 있습니다.
댓글 달기