쓰레드 안에서 Form1의 컴포넌트에 액세스하셨다는 말씀이신데요.
절대루 안됩니다. 그렇게 하면 그런 결과가 나옵니다. --;;
쓰레드에 익숙하지 않은 경우에 흔한 실수지요.
꼭 쓰레드 안에서 폼의 컴포넌트를 접근해야 한다면, 별도의 쓰레드 멤버 프로시저로 만든 다음 Synchronize 함수로
감싸서 실행해줘야 합니다. 이렇게 하면 서브 쓰레드 안에서 접근하는 것처럼 보이지만 실제로는 메인 쓰레드(디폴트
쓰레드)에서 동작하게 됩니다.
구체적으로는, 다음과 같이 해보세요.
쓰레드 선언의 private 섹션에 새 프로시저를 선언합니다.
TMyThread = class(TThread)
private
procedure DoProgressBarChange;
...
end;
그리고 그 프로시저를 구현해줘야겠지요.
procedure TMonitorThread.DoProgressBarChange;
begin
Form1.ProgressBar1.Visible := True;
Form1.ProgressBar1.Max := m_cnt;
Form1.ProgressBar1.Position := 1;
i := 1;
while(m_bRunning = True) and (i <= 100)do
begin
Form1.ProgressBar1.Position := i
i := i + 1;
end;
SendMessage(Form1.Handle, BK_RESETCONTROL, 0, 0);
Terminate;
end;
이렇게 한 후, 실제로 그 루틴이 필요할 때는,
Synchronize(DoProgressBarChange);
이렇게 호출하시면 됩니다.
그런데.. 일부 코드만 보여서 전체 로직을 알 수 없어서 제가 함부로 짐작하긴 그렇지만, 마지막에 Terminate 호출이 있는
걸로 봐서는 쓰레드를 종료하면서 작업을 하는 거 같은데요. 그렇다면 동작은 Terminate만 남겨놓고, 나머지 코드는 모두
OnTerminate 이벤트 핸들러에 코딩하는 것도 방법입니다.
뭐 이렇게 해도 사실 내부적으로는 동일한데.. 왜냐하면 OnTerminate 이벤트 핸들러도 VCL 내부적으로는 Synchronize로
감싸서 실행이 되기 때문입니다. 그래도 Synchronize를 위한 처리들이 조금은 줄어드니까 코딩 양은 조금 적어지겠죠.
그럼...
델초보 님이 쓰신 글 :
: 쓰레드 처음 사용하는거라서 그런지. 아직 개념도 안잡힌 상태인데요..ㅜ.ㅜ
:
: 일단 써야되기에 쓰는데.
:
: 잘 안되네요. 일단 실행은 다 되는데 실행다되고 '종료' 를 누르게 되면
:
: Form1.ProgressBar1.Visible := True;
: Form1.ProgressBar1.Max := m_cnt;
: Form1.ProgressBar1.Position := 1;
: i := 1;
: while(m_bRunning = True) and (i <= 100)do
: begin
: Form1.ProgressBar1.Position := i
: i := i + 1;
:
: end;
:
: SendMessage(Form1.Handle, BK_RESETCONTROL, 0, 0);
: Terminate;
:
: 위와 같이...처리 했습니다.
:
: 실제 소스는 아니고요. 지금 에러가 하두나서 다 막아놓고 테스트 삼아 코딩한건데요.
:
: Form1.~ 이렇게 프로그레스 바 셋팅하는 부분을 막아놓으면
:
: 에러가 나지 않다가 스레드 안에서 저렇게 셋팅을 딱 하면
:
: 프로그램 돌아가는 건 문제없이 잘 돌아가는데요.
:
: 끝나고 종료를 누르면..
:
: Project test.exe raised exception class EOSError with message ' System Error, Code 1400. 잘못된 창 핸들입니다.'
:
: Process stopped. use step or Run to continue.
:
: 이렇게..ㅡ,ㅡ 메시지가 항상 뜹니다..
:
: 쩝..
:
: form1.~ 이렇게 되있는 부분을 막고 단순 연산하고 끝내는...거라면..
:
: 종료 시 아무 문제없는데
:
: form1.~ 이런식으로 되어있는 부분을 추가하는순간..에러가 폭주하네요..ㅜ.ㅜ
:
: 제가 form1 의 핸들을 따로 받아와서 해야하나요?ㅜ.ㅜ
:
: 아...초보다보니 힘드네요.
:
:
:
: 그리고 여유 되시는분..ㅡ,ㅡ 이 쓰레드 안에서 원래 의도는
:
: 엑셀 파일을 읽는거거든요.
:
: 엑셀 파일 읽어서 디비에 넣는데..
:
: 이상하게.ㅡ,ㅡ 다 close 해준다고 해주엇는데..
:
: 프로세스 창에 보면 excel.exe 파일이 나중에 보면 주루루루~올라와있네요.
:
: 이건..ㅜ.ㅜ 대체 왜 종료가 안되는지도 종료좀 부탁드리겠습니다.
:
: 감사합니다. 수고하세요.(__)~
|