|
감사합니다! 덕분에 정말 많은 도움이 되었습니다~!!
구현은 이렇게 했습니다.
1. 메인쓰레드에서 Log Add()
2. 서브쓰레드에서 파일저장부분만 Synchronize
3. 파일저장 이후 서브쓰레드에서 서버에 파일 전송
이렇게 하는게 제가 걱정했던 부분들을 해결하면서 간단히 처리가 되네욤.
처음 이 질문을 올릴때 여러가지 궁금한 것들이 있었는데,
많은 분들의 조언 덕분에 조금씩 알아가게 되네요.
예를 들어
1) 혹시 StringList가 쓰레드 안전하지 않을까? 아니면 쓰레드 안전하게 만들어 놓은 Class가 있지 않을까?
(좋은님이 만들어 놓은 것을 복사해서 사용하면 된다던가 ^^)
2) StringList 모든 조건에 동기화처리를 하는게 정답인가? 그렇다면 혹시라도 서브쓰레드에서 권한을 가져간 상태에서
멈추게 되면, 메인쓰레드에서 해당권한을 받기 전까지는 같이 멈추게 되지 않는가?
3) 동기화(뮤텍스, 크리티컬섹션등) 문법을 사용하지 않고, 처리 할 수도 있지 않을까?
등등등,,,
많은 분들의 조언 덕분에 잘 배우고, 또 공부해 봐야 할 것들도 알게 되었습니다.
답변 주신 모든 분들께 감사인사드립니다~~
박지훈.임프 님이 쓰신 글 :
: 통신 문제로 시간 지연이 생긴다면 말씀하신 그런, 그러니까 통신 과정에서 블로킹이 걸린 때문에 메인쓰레드가 지연되는 상황이 벌어질 수 있겠습니다.
:
: 그런 우려가 있다면 이렇게 처리하면 될 듯 싶네요.
: 1. 서브쓰레드에서는 Synchronize로 StringList의 내용을 다른 객체로 복사만 합니다.
: (굳이 StringList를 새로 만들어서 하기보다는, 내용만 복사해두면 되는 것이니 그냥 스트링이면 되겠네요)
: 2. Synchronize를 빠져나온 서브쓰레드의 일반적인 루틴에서 이 복사본을 파일로 저장하고 통신으로 전송합니다.
:
: 쓰레드간 충돌이 생길 수 있는 것은 같은 StringList에 두 쓰레드가 동시에 접근할 경우 뿐이므로, Synchronize에서는 내용 복사를 해두고 복사본으로 파일 저장 및 전송을 하게 되면 충돌의 여지는 없어지지요. 더불어서, Synchronize의 특성상 최소한의 동작만 Synchronize로 빼내는 것이 권장되기 때문에 더욱 나은 방법이 되겠습니다.
:
:
: 그린비 님이 쓰신 글 :
: : Synchronize 함수가 메인 UI 접근에서만 사용하는 줄 알았는데, 이런 부분이 있었군요~!
: : 무지무지 감사드립니다~~~~~~~~~
: :
: : 그런데 한가지 걱정되는게, Synchronize 함수사용 시,
: : 혹시나 서브쓰레드에서 파일저장후 서버에 통신중에 ,
: : 통신 문제로 멈추게 되면,(몇 초 에서 몇 십초동안 응답없음 상태가 될 경우)
: : 메인쓰레드도 그 시간 동안 멈추게 되진 않나요? 서브쓰레드 동작이 메인쓰레드에 영향을 주면 안되서요.
: :
: :
: :
: : 박지훈.임프 님이 쓰신 글 :
: : : 그런 목적으로 사용하는 것이 TThread의 Synchronize 함수입니다.
: : : 특정 객체에 대한 접근이 두 쓰레드 사이에서 충돌할 것으로 예상되는 경우 서브쓰레드의 동작을 Synchronize 함수를 사용해 실행하면 됩니다. 그러면 해당 동작은 서브쓰레드에서 실행했음에도 메인쓰레드의 컨텍스트에서 동작하게 됩니다.
: : :
: : : 말씀하신 케이스에서는, 서브쓰레드에서 StringList를 파일로 저장하고 서버에 전송하는 동작을 별도의 함수로 뺀 후, 그 함수를 Synchronize 함수로 감싸서 호출하면 됩니다.
: : :
: : :
: : :
: : : 그린비 님이 쓰신 글 :
: : : : 안녕하세요~ 더운 날씨에 노고가 많으십니다~~!
: : : :
: : : : 전역으로 선언한 StringList가 있고요.
: : : : 여기에 로그를 Add 하고 파일 저장 후 서버에 전송하는 게 목적입니다.
: : : :
: : : :
: : : : 1) 메인 프로세스에서는 StringList에 Add 만 합니다.
: : : : 2) 추가 쓰레드에서는 StringList를 주기적으로 파일 저장을 하고, 서버에 전송을 합니다.
: : : :
: : : : <질문 1>
: : : : 여기에서 문제가 예상되는게, 메인프로세스에서 StringList에 Add를 하는 도중에
: : : : 만약 추가 쓰레드가 StringList에 접근해서 파일저장을 하려고 하면 동기화가 안지켜 질 것 같은데요..
: : : : 정말 그런가요?
: : : :
: : : : <질문2>
: : : : 해결 하려면 메인프로세스에서 파일을 저장하고, 추가 쓰레드에서 서버에 전송을 하게 하면
: : : : 해결이 될까요?
: : : :
: : : :
: : : : 관심 부탁드립니다~~~
|