2009-08-12 3 views
2

매우 흥미로운 사실을 발견했습니다. 나는 외부 소스에서 오는 데이터에 의해 업데이트되고있는 맞춤형 GUI 요소와 관련된 애플리케이션을 테스트하고 있었다. GUI의 업데이트는 시리얼 포트에 데이터가 도착할 때마다 슬롯 (Qt 특정 정보)을 사용하여 수행되었습니다. 이제 데이터가 초당 10 패킷 씩 올라갔습니다. 즉, 업데이트 GUI 기능은 초당 10 패킷으로 호출되었습니다. 이로 인해 응용 프로그램 속도가 느려지는 동시에 메모리 사용량이 지속적으로 증가하는 결과를 낳았습니다. 몇 시간 만에 60MB에서 시작하여 65MB로 증가했습니다.C++/Qt 메모리 누출?

내 결론은 GUI 업데이트가 느리고 업데이트를위한 슬롯이 초당 10 번 호출 될 때 슬롯 호출이 장기 실행에 대기하므로 응용 프로그램 응답 시간이 저하된다는 것입니다.

들어오는 값을 캐싱하고 들어오는 값이 변경되면 GUI를 업데이트하여이 문제를 해결했습니다.

valgrind-memcheck, leak checker와 같은 다양한 무료 도구를 사용해 보았지만 결과가 유용하지 않습니다. 실제로 누수 검사기가 누수를 찾지 못했지만 프로그램 메모리 크기가 계속 증가하고 있습니다. GUI 업데이트가 본질적으로 느리기 때문에 신호 슬롯 연결 대기열로 인한 것입니까?

여기에 문제가 있습니다. 메모리 누수를 추적하는 것은 충분히 어렵습니다. Qt가 관련되어 있다면 어떻게 불행한 프로그래머가 문제를 확신 할 수 있습니까? 즉 실제로 메모리 누수가 발생하거나 신호 슬롯 연결 대기열에 걸리면 어떻게됩니까?

+0

동일한 사용자가 http://stackoverflow.com/questions/1186379/detecting-memory-leaks-in-c-qt-combine의 가능한 속임수 –

+0

다른 점 Neil, 이전 질문은 실제로 사실상의 메모리였습니다. 누출은이 문제가 나를 좋아하는 많은 사람들이 메모리 크기의 증가가 신호 슬롯 연결 대기열로 인한 것임을 알지 못하기 때문에이 문제를 부각시키기위한 것이 었습니다. – rocknroll

+0

Valgrind의 대산 괴는 아무것도주지 못합니까? –

답변

0

는 그것이 GUI 업데이트가 본질적으로 느린로 인해 신호 슬롯 연결 대기의 의미합니까?

...

는 incomming 이벤트를 중지하고 당신의 기억은 잠시 후 해제해야합니다.

+0

@Tim Qt에는 응용 프로그램마다 하나의 GUI 스레드 만 있습니다. 이제 외부 장치 인터페이스를 위해이 스레드로 데이터 수집을 처리한다면 메모리 크기가 꾸준히 증가 할 것인가 아닌가? 팀에서 개발하지 않은 응용 프로그램에서 이러한 시나리오에 직면하고 있기 때문입니다. 외부 장치 인터페이스는 기본 GUI 스레드로 구성됩니다. 메인 GUI는 또한 다른 외부 장치가 피기 백 장치 인터페이스 이외에 데이터를 보낼 때도 업데이트됩니다. 나는이 디자인을 범인으로 의심하지만 내 지점을 확증 할 수있는 신뢰할 수있는 출처를 찾지 못했습니다. – rocknroll

+0

직접 또는 대기중인 신호 슬롯 연결입니까? – TimW

+0

기본 신호 슬롯 설정을 지금까지 변경하지 않았으므로 이것이 기본 설정입니다 (이 설정은 대기열에있는 연결 일 수 있습니다). – rocknroll

1

메모리가 조각화되어있을 수 있습니다. AFAIK 메모리는 페이지가 정렬되고 페이지 크기의 배수 인 경우에만 OS에 다시 제공됩니다. 일부 메모리 할당자는 메모리를 되돌려주지 않으며, googles malloc이 마음에 듭니다.

그래서 Qt 나 앱이 지속적으로 크기를 조정하고 메모리 크기가 작은 작은 블록을 해제하면 메모리가 유지 될 수 있습니다. 시간이 지남에 따라 메모리 사용량의 증가가 느려집니다.

개체와 같은 일부 QWidget을 업데이트하는 경우 repaint()를 사용하고 repaint()를 사용하지 않아야합니다.