Q&A

  • 쓰레드처리하는데 무작위로 시스템이 홀드되면서 열어놓은 DB가 날라갑니다.
델파이로 처음 프로그램을 짰는데. 대충 내용은 이렇습니다.

메인 프로그램에서 화면을 관리하고 어떤 액션이 들어오면 (일례로 외부장비의 start버튼) thread를 생성해서 그 일을 처리합니다. 물론 메인 화면은 수치들을 보여주기만 하구요. thread가 끝나면서 현재 상태를 보여줍니다.

standard db를 사용하구요. 근데 이게 무작위로 시스템이 홀드되면서 현재 열어 놓은 db가 날라갑니다. 물론 프로그램은 작동이 안되구요. 동적으로 메모리를 쓴것도 없고 전체순서가 아주 단순하거든요. 근데 이게 아침부터 수행을 해놓고 저녁때쯤 보면 맛이 갈때가 있고 어쩔때는 몇일 있다가 그러기도 하구요. 정말 돌아버리겠습니다. thread를 생산했다가 죽이고 이걸 많이 해서 그런가요?

어떠한 부분을 살펴보아야 할까요? thread는 ... 자동으로 해제해주는거를 만들면서 true로 만들어주었습니다. 일단 동작되면 db작업은 안하구요. 액션이 끝나야 db작업을 합니다.  무슨 말이라도 좋으니 조언좀 해주세요. 어디를 본살펴보라던가...

에러는 "응용프로그램 오류..."라고 나오거든요. 제가 C/C++로 짤때는 보통 메모리쪽만 아니면 에러가 안나오는데... 지금 짠건 메모리 할당할게 없어서 다 배열로 처리했거든요. 입출력 갯수가 확실해서요. 근데도 프로그램이 죽는걸 보면 (랜덤하게) 어디에 메모리가 열나 쌓이던가...하는거 같은데.

db처리는 다음과 같이 했습니다.
Datasource, Query를 사용해서 정해진 db를 읽습니다. 프로그램 로딩시에요.
Query1.SQL = "select * from table_main"
현재 선택된 놈에 대한 필드들을 읽어와서 변수에 세팅을 합니다. 그리고 외부 입력이 들어오면 thread를 생성하고 세팅된 변수에 따라 액션을 수행합니다. 이게 끝나면 화면에 그 결과를 보여주고요.
start를 해서 수행중에 물론 stop을 눌러 정지를 시킬수 있습니다. 그러나 이경우도 처음 start누른것처럼 행동하게 되어 있거든요. 지금까지 수행한건 없어지고 처음부터 행동을 하면 되거든요....

도와주세요. 어디를 봐야 할지 정말 미치겠습니다. 메모리 디버깅은 어떻게 해야 하는지...그리고 외부기기에 따른 라이브러리는 장비살때 주었거든요. 혹 이놈에서 세는걸까요? 3일을 잠을 못잤습니다. 이것때문에요.









3  COMMENTS
  • Profile
    타락천사 2002.10.22 01:33
    안녕하세여. 타락임다..

    사실 VC++ 로 개발 할 때보다 델파이로 하면 훨씬 Easy 하게 할수 있습니다.

    하지만, 공통코드를 델파이가 대신 적어 줄 뿐 하는 일은 VC++ 과 같습니다.

    혹시 DB Connection 이 너무 많이 열린게 아닐까여? Thread 에서 작업이 끝난 후 DB Server 와의 Connection 을 온전하게 끊는가요?

    그리고 Thread 를 쓰신다고 하셨는데, DB 작업이 Thread 에서 돌려면 Session 을 Thread 에서 생성해야 합니다. Thread 에서 메인의 Session 을 기냥 가져다 쓰면 동시에 필드 수정이 발생하면서 에러가 발생할 수 있습니다.
    그 부분은 VC++ 과 델파이가 동일합니다. 아직 델파이가 익숙하지 않다고 하시니 VC++ 로 DB 작업을 Thread 로 돌리는 코드를 찾아 보시고, 델파이로 하는 코드를 찾아서 비교해 가며 사용하시면 될겁니다.

    즐푸하세여..

    타락천사..

  • Profile
    박정찬 2002.10.22 03:52
    DB connection이 너무 많이 열렸다는게 어떤 의미인가요? 죄송합니다. 제가 잘 이해를 못해서요. 일단 Thread에서는 DB작업을 하지 않구요. Thread에서는 지정된 배열에 있는 수치를 장비에 넣어줍니다. 그역할 밖에는 없어요. 다 끝나면 한개가 끝났다고 DB에 저장하기는 합니다. 물론 main에서요. thread에서 하는 것은 아니구요.

    thread실행 -> thread가 종료되면 불러지는 프로시저에서 DB에 저장합니다. (이 프로시저도 thread의 일부분인가요?)=> 여기서 문제가 될까요? DB에 저장하고 나서 DB를 끝는다는게 어떤건지...전 그냥 table을 열어서 append만하고 다시 테이블을 닫았거든요.  이 thread에서 어떤 다른게 필요한가요.
    거듭 죄송합니다. 제가 아는게 없어서리. 어떤것을 참고해야 하는지....

  • Profile
    타락천사 2002.10.22 04:35
    안녕하세여. 타락임다..

    흠, 곰곰히 내용을 다시 읽어 봤습니다.

    '응용 프로그램 오류' 라는 메세지는 상당히 모호합니다. 그런데 '시스템이 홀드 된다' 는게 무슨 의미인지 모르겠습니다. 컴퓨터가 멈춘다는 건가요? '무작위로 홀드 된다' 고도 하셨는데 무슨 상황인지 잘 이해가 안갑니다.

    하여간 DB 쪽은 아닌것 같습니다. 잘못된 클래스 참조나 메모리 leak 이 있지 않나 의심갑니다. 질문 내용만으론 짐작하기 어렵습니다.