여러개의 스레드를 사용할 때에는 각 스레드간 동기화 작업을 잘 해야 합니다.
질문한 내용에 있는 코드만 봐서는 대답을 해드리기가 곤란하네요.
m델파이m 님이 쓰신 글 :
: Unit1
:
: use Unit2, Unit3
: var
: FilenameThread : TFilenameThread
: DbUpdateThread : TDbUpdateThread
:
: Try
:
: for R=0 to FileListBox1.selCount -1 do
: begin
:
: {#1.스트링그리드에 불러오기 쓰레드}
: FilenameThread.Create(false);
:
: {#2.스트링그리드에 올린 데이타를 DB로 올리는 업데이트 쓰레드}
: DbUpdateThread.Create(false);
:
: end;
:
: Finally
:
:
: showmessage(intToStr(R) + ' 개의 파일을 업데이트했습니다.완료')
:
: end;
:
: ---------------------------------------------------------------
: Unit 2 {파일내용을 스트링그리드로 불러오기 쓰레드}
: for i=1 to 100 do
: begin
: 스트링그리드에 넣기
: end
:
: ---------------------------------------------------------------
: Unit 3 {스트링그리드에 올린 데이타를 DB로 올리는 업데이트 쓰레드}
: for i=1 to StringGrid1.recordCount-1 do
: begin
: DB에 넣기
: end
:
: 대충 소스코드는 위와 같은 구조입니다.
: 즉, 파일이 10개 있을때
: 1) 1번 파일을 불러서
: 2) 스트링그리드에 올리고
: 3) 스트링그리드에 올린 데이타를 DB에 인서트
: 4) 다시 2번 파일을 불러서 2),3)을 반복
: 이렇게 하려고 합니다.
:
: 그런데...위에 처럼 쓰레드로 구현해서 실행해보니 문제가 발생합니다.
: 실행해보니 실제는 1번파일부터 10번파일까지
: 2)단계를 계속 올리더군요. 즉 2)단계를 10번하고
: 그리고 3)단계를 또 10번하더군요..
:
: 제가 원하는건 1번파일을 스트링그리드에 올리고 그 데이타를 DB로 올리고
: 그리고 2번파일을 스트링그리드에 올리고 그 데이타를 DB로 올리고 해서
: ..
: 10번 파일까지 스트링으로 올리고 DB로 올리고
: 이런식으로 하려고 합니다.
:
: 그런데 실제보니까 위에서 처럼 1~10번파일을 스트링그리드에 쭉 올리고
: 그거 끝나면 최종적으로 스트링그리드에 올라간 데이타를 10번에 걸쳐서
: DB에 올리더군요...즉 동일한 데이타를 10번 인서트하는겁니다.
:
: 그리고 쓰레드는 finally까지 모두 마치고 쓰레드를 실행하더군요...
: 그러니까 쓰레드가 시작도 안했는데 완료메시지를 보인후에
: 쓰레드가 시작하더군요...제가 델파이 한지 얼마 안된지라
: 책보면서 쓰레드를 적용해서 해볼려구 하는데 이런
: 어려움이 있네요...
: 고수님들의 가르침을 바랍니다.
: 수고하세요.
|