저 아래 질문에서 좀 정리가 되기는 한듯 한데...이해가 잘 안되서요. 도와주세요.
1. 외부 입력이 오면 thread를 부르고 thread에서는 전혀 db 액션이 없습니다. 단 postmesage에서 thread_done메시지를 받고 이 프로시져에서 수행결과를 db에 저장합니다. thread예제를 살펴보았으나 여기서 db작업을 하는것에 대해 어떠한 말도 안나와 있더군요. 이 프로시저에서 화면에 정보를 출력합니다. sync...도 사용하지 않습니다.
-> thread_done이 왔을때 해당 프로시저는 thread내부인가요? 헷갈리네요. thread_done이 되었을때 db작업을 하는게 session을 꼭 열고 작업을 해야 하나요? 이건 그냥 thread의 끝에 끝을 알리는 저장을 하는것인데요...
2. debugging을 돌리니까 Eaccessvioliation이 나오거든요. 매번 나오는 것은 아니고요. 이건 아마 테스트를 하느라고 thread만들걸 nil로 만들고 다시 참조하는 바람에 나오는것 같은데...
3. thread safe란게 있던데...혹 제가 프로그램을 thread safe하게 안짠건 아닌까요? 그렇게 짜면 응용프로그램 오류가 나고 프로그램이 멈추는 현상이 날수가 있는가요?
하루종일 프로그램을 돌리거든요. 어떤날은 안나오고 어떤날은 "응용프로그램 오류"라고 나와요. 제가 메모리를 사용했다면 그쪽을 보겠는데...db도 아닌것 같고(프로그램이 멈추어 버립니다) 미칠지경입니다. 예측가능한 것은 쓰레드인데...쓰레드도 단순해요. 다만 코드가 PostMessage가 부르는 프로시져에서 할일이 많습니다. 즉, PostMessage에서 thread_done이 되었으니 화면에 좀전에 실행한 것을 (수치)를 보여주고 thread := nil로 만들지요. 그리고 또 thread를 실행해서 보여주고....혹 이 루틴에서 메인화면의 버튼이나 리스트에 적는데 이것 때문인가요? 근데 왜 맨날 나오는게 아니고 어쩌다 한번씩 나올까요? 혹. 이 작업을 할때 syncronize(...)를 사용해야 할까요? 근데 이건 thread의 execute메소드에서 실행안해도 되는거거든요. 도와주세요.
저.. 혹시. Thread 에 nil 을 할당했나여?
그럼 문제의 여지가 있을 수 있습니다.
아래가 스레드 종료에 대한 설명...
스레드가 종료되는 시점은 Execute() 의 실행이 종료되는 시점임다. Execute() 가 종료되면 델파이 RTL 인 EndThread() 가 호출됨다. EndThead() 는 API 함수 ExitThread() 를 호출함다. ExitThread() 는 스레드의 스택을 적절히 처분하고, API 스레드 객체를 해제함다. API 부분 처리가 끝남다.
다음에 델파이에서 선언한 TThread 객체 처리가 남았죠. 간단한 방법은 TThread 객체의 FreeOnTerminate 속성을 True 로 하는 것임다. 그럼 Execute()의 실행이 종료되면 TThread 객체를 제거함다. 그렇게 하지 않고 직접 객체를 해제시키려면 TThread 의 OnTerminate 라는 이벤트에서 하는 것도 좋습니다. TThread 의 OnTerminate 이벤트는 자신의 실행이 끝날 때 발생함다.
즐푸하세여..
타락천사..