|
CriticalSection 을 사용하시든 Syncronize를 하시든 문제는 없습니다.
그러나 CriticalSection 은 윈도우즈에서만 쓰는 API (그렇게 알고 있습니다만) 입니다.
Syncronize 는 다른 스레드를 멈추는 효과를 갖습니다. 즉 다른 녀석들은 잠시 대기하라는 것이죠.
TCriticalSection을 이용하여 임계영역을 주셔도 됩니다. 임계영역보다 위험영역이 더 이해하기 쉬운데요..
여러 스레드가 공동으로 겹치는 access부분은 위험 영역이라는 것이죠.
VCL 에서 help 에 따르면 Syncronize 는 VCL 관련해서도 처리를 해주고 있습니다.
또한 Syncronize는 함수 호출이기에 CriticalSection 보다 사용이 좀더 용이 합니다.
일반적으로 Syncronize 는 "정확하고 빠르게 처리" 를 해야 합니다.
즉 Syncronize 든 CriticalSection이든 그 안에서 많은 시간을 보낼수 없다는 것이죠.
ADO 를 Syncronize하는 것은 결국 ADO 가 여러 스레드에서 접근하는 녀석이기에 ADO가 일을 할때
다른 스레드들이 방해하지 말라는 것 입니다.
ADO의 구성상 속도가 문제가 된다면
전에 말씀드렸듯이 ADO 에 직접 일을 시키지 마시고 중간에 버퍼를 두어 거기에 데이터를 push 하시고
Syncronize를 끝내고 빠르게 돌아오는 방향으로 처리해주시는것이 바람직 합니다.
ADO는 해당 QUEUE 를 보고 느긋하게(???) 처리해주면 되겠죠..
용맨소녀 님이 쓰신 글 :
: 여러 사용자가 동일한 변수에 기록하거나 할 일이 있다고 가정한다면요.. 패킷통신도 문제가 될 수 있는건가요?
:
: OnExecute 안에 크리티컬 섹션이라도 붙여줘야 하는 건지요?
:
: 크리티컬 섹션을 붙여주면 굳이 ADO를 Synchronize할 필요도 없지 않을까요..
:
: 자꾸 질문해서 죄송합니다.. 쓰레드만 나오면 왜 이렇게 헷갈리는지..ㅠㅠ
:
:
: Lyn 님이 쓰신 글 :
: : OnExecute 는 Thread 내부에서 호출됩니다 `-`;
: : 물론 인디는 Blocking Socket 이니 클라이언트마다 전부 다른 Thread구요
: :
: : 여러개의 Thread 에서 하나의 ADO 객체를 접근한다면 싱크로나이즈가 필요합니다
: :
: : 용맨소녀 님이 쓰신 글 :
: : : 그거 쓰레드 안에서 호출할 때 쓰는거 아닌가요? 인디도 내부적으로 쓰레드 돌리니까 Synchronize를 써야하는건가요?
: : :
: : : 그냥 TCP서버 하나만으로 패킷통신하면 순차실행될거라 생각해서 OnExecute 안에서 패킷처리하고, DB처리하고 그렇게 했거든요..
: : :
: : : 일단, 지금 만든 서버는 TCP 컴포1개에 ADO 1개 붙였고요.. 패킷이 이따금씩 오는 서버라 보니 아무 문제없이 쓰고 있었습니다만.. 제가 잘못 알고 있는거면 답변 부탁드립니다..
: : :
: : :
: : :
: : : 둘리.CSIEDA 님이 쓰신 글 :
: : : : 동시에 오지는 못할겁니다.
: : : : 동시에 오는것처럼 보이는거죠.
: : : :
: : : : 분명 Indy Receive 에서 Ado 로 넘길때 Syncronize 를 하실거니까 별 문제 없을것 같군요.
: : : : 만약 ADO 처리속도가 늦다면 tcp 연결이 timeout 걸릴 가능성도 있을경우
: : : : 더욱 안정되게 하신다면 중간에 ADO 에대한 processing queue 를 만들어 중간 연결해주시면 좀더 안정될듯 하구요.
: : : :
: : : : 수고하세요.
: : : :
: : : : 용맨소녀 님이 쓰신 글 :
: : : : : 하나의 폼에 인디 TCP서버 컴포를 3개 붙이고요..(포트는 각각 다르게..)
: : : : :
: : : : : 거기다 ADO 컴포를 하나 붙이는데요..
: : : : :
: : : : : 3개의 TCP서버에서 패킷 통신 중 DB에 데이타를 저장하라는 패킷이 동시에 날아오면, ADO 컴포에서 DB에 값을 동시에 쓰려고 할테니까 문제가 발생하지는 않을까요?
: : : : :
: : : : : TCP서버 컴포마다 ADO컴포를 하나씩 배당해야하는지요?
: : : : :
: : : : : 쓰레드를 별도로 쓴다든가 그러지는 않습니다.. 답변 부탁드립니다.
|