C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[2569] [질문] TListView->Item->Clear() 에러는...
신정호 [] 4056 읽음    1999-12-24 00:00
String temp;

    TListItem *li = Form1->ListView1->Items->Add () ;

    temp = Filename;

    li->Caption = temp;

    li->ImageIndex =  FileInfo.iIcon;


    temp = Size;

    li->SubItems->Add (temp);


    temp = Pathname;

    li->SubItems->Add (temp);

위의 코드가 아이템을 삽입하는 부분입니다...전혀 문제 될게 없습니다...


지우는 부분은 ListView->Items->Clear를 호출하구요...역시 전혀 문제 될게 없습니다...



몇날 몇일 테스트를 해본 결과...

리스트에 item을 삽입하는 Thread의 문제 인 것 같습니다...


제 프로그램의 로직은 item의 삽입은 dirThread에서 하게 되고...

Item을 모두 지워야 하는 경우에는 main에서 clear를 호출합니다...

dirThread는 수십개 정도가 생성되는데, 이 dirThread들이 정상 종료를 하면...

clear를 불러도 에러가 되지 않는 걸로 결론을 내렸습니다...

문제는 돌고 dirThread들을 죽이고, clear를 호출하는 건데...


while(1)
{
   .....
 
   dirThread->Suspend();

   dirThread->Terminate();

   delete dirThread;

   if ( dirThread ) ShowMessage("alive");
  
    ....GetNextThread()...

   if (xxx) break;
}

listView->Items->Clear();

이런 과정을 거치게 되는데....

죽였던 모든 Thread에서...살아있다고 alive이라는 메시지가 뜹니다...-_-;;;

책에서 "Thread의 강제 종료"라는 항목이 있어서 읽어봤는데....

Thread를 자신이 아닌 Thread가 자신을 죽이면 바로 죽지 않는다는군요...음...

그리고 C++빌더 헬프를 봐도 Terminate를 호출하면 바로 죽는게 아니라...어쩌구..

그래서 그런 건지...

여하튼...Thread가 죽지 않기 때문인 것 같습니다...

그리고...Item을 삽입하는 코드는 세마포로 단 하나의 Thread만이 집입하게 해놔서...

Thread를 전부다 죽이고 Clear()를 호출했을 때,

그 단 하나의 Thread가 Item을 삽입하는 코드에 영향을 미치면...에러가 나는 거고...

그 이후나...그 전이라면 에러가 나지 않는 거 같습니다...

그래서...불규칙적인 에러가 나는 것 같습니다...

음...이럴 경우...어떻게 해결을 해야하는지 생각을 골똘히 해봤는데...

일단...돌고 있는 Thread가 정상종료할때 까지 기다릴 수 없는 경우가 있기 때문에...

참...까다롭습니다...그래서 생각한 것이...

ListView->Clear하지 않고, Clear가 된 ListView가 필요한 놈에게는 다른 ListView를 동적으로

생성해서 주는 겁니다...그리고 이전의 ListView는 이전의 dirThread들을 강제 종료 시키고...

적당한 시간 뒤에...clear를 하는 겁니다...그리고 이 2개의 ListView를 번갈아 가면서

사용하는 겁니다...음...더블 버퍼링 같은거라고 할 수 있을지...음...


그런데..TListView를 어떻게 동적생성을 하죠??? 그 많은 프로퍼티를 설정해야 합니까???

아니면...속성을 카피해 온다던가...뭐 그런거 없나요??? 일단 시도를 해봤는데...

잘 안되네요...


그런데 이 방법도 문제가 있습니다...사용자가 그냥 종료를 눌러버리면...-_-;;;

음...괜찮은 해결책 없을까요???


가장 좋은 해결택은 Thread를 즉각 강제 종료시키는 것인데...

음...

+ -

관련 글 리스트
2569 [질문] TListView->Item->Clear() 에러는... 신정호 4056 1999/12/24
2578     Re:TThread내에서 VCL객체의 사용과 TThread의 종료 박지훈.임프 6023 1999/12/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.