|
데이터 로거 비슷한걸 만드시나 봅니다..
프로그램이 간결하고 에러가 발생할 소지가 낮다면 하나의 프로그램에 쓰레드를 사용하셔서 구현하셔도 됩니다
하지만 출력 데이터의 양이 많아 출력시에 부하가 걸린다면, 또 그것이 프로그램의 안정적인 작동 (1초당 데이터 저장)에
지장을 준다면 프로그램을 분리하시는것은 어떨까 합니다..
아무런 부가기능없이 데이터 저장만 해주는 (너무나 간단해서 오류나 버그가 거의 존재할 수 없는 크기의) 프로그램을 만드시고.
그 데이터를 화면에 출력 시켜주는 부분을 다른 프로그램으로 구현하시는 겁니다..
이경우 화면 출력 프로그램에 오류나 버그가 있어 프로그램이 얼어 버린다거나 해도 데이터는 다른 프로그램에 의해 안정적으로 저장되므로 중요한 데이터 수집에 높은 안정성을 부여하실수 있으실 겁니다.
실제로 기상청 기상장비 로깅 프로그램 만들때 썼던 방법이었고 나름? 괜찮았습니다..
로깅 프로그램 (데이터 요청 및 수신, DB, 파일 혹은 공유 메모리에 저장)
출력 프로그램 (DB, 파일 혹은 공유 메모리 접근 및 출력)
물론 출력 부분의 요구사항에 따라 어떤 형태의 저장 방식이 나을지 달라지겠죠..
단순히 최근 몇개의 데이터만 출력해서 보여주면 된다면 공유 메모리를 이용하는것도 나쁘지 않습니다.
그리고 정확히 1초의 시간이 필요하시면 일반 타이머는 대신 멀티미디어 타이머를 쓰실것을 권장해 드립니다.
더불어 프로그램의 실행 우선순위를 조금 높여주시는것도 나쁘지 않겠죠.. :)
장성호 님이 쓰신 글 :
: GUI쓰레드란 메인스레드라고 적어줬는데요...
:
: 모든프로그램은 쓰레드로 동작합니다.
: 쓰레드관련 코딩을 하지 않아도..
:
: 기본적으로 쓰레드가 하나 생성되는게 그게 메인쓰레드입니다.
:
: 화면에 보이는 모든것이 메인쓰레드에서 동작하구요
: Timer등도 Main쓰레드에서 동작합니다.
:
: 즉 Gui쓰레드에서 무슨 작업을 한다는것은
: ButtonClick 도 해당되구 , Timer도 해당되구.. 화면에 보이는 대부분의 control 이벤트가 gui쓰레드에서
: 동작하니까.. 그냥 적당한데 코딩하시면 되는것입니다
:
: 보통 쓰레드라고 표현하지 않으니까 헷갈리는데.. 구분이 잘안되므로 메인쓰레드(Gui쓰레드)라고 표현한것입니다.
:
: ---------------------------------------
:
: 통신은..
: 쓰레드에서 주기적으로 송수신 해야겠죠..
:
: 쓰레드를 만들어서 일정시간간격으로 Packet을 보내고 받으시면 될듯 하네요
:
: Vcl(델파이/빌더)의 기본 Socket인 TClientSocket은 기본적으로 NonBlocking으로 동작하고
: OnReceive이벤트가 Gui쓰레드에서 동작하도록 만들어져 있어서
: 님께서 하고자 하는 경우와는 맞지 않는것 같구요
:
: 다른socket 컴포넌트를 쓰던지.. 구현하던지 하는것이 낳을것 같습니다.
:
: 쓰레드에서는 windows Timer를 적용하기가 불편하므로
: Sleep(1)과 TickCount 또는 WaitForSingleObject 등을 이용해 일정시간마다 작업하시면 될듯 합니다.
:
: ThreadTimer 뭐 그런게 있었던것도 같던데.. 그걸 이용해도 될듯 하네요...
:
: -----------------------------------------------------------
: 쓰레드와 gui와 동기는 Event나 Message등 여러가지중 하나 선택해서 동기화 하면될듯하구요..
:
:
: ps.
: 그런데 화면 업데이트가 왜 그렇게 느리죠?
: data를 읽어와 display하는 방식에 문제가 있지는 않을까요?
: 그부분도 한번 살펴보심이 좋을듯 합니다.
:
: 그럼..
:
: 한태희 님이 쓰신 글 :
: : 답변 감사 합니다.
: : 하지만, 죄송합니다만..
: : GUI쓰레드에서 어떻게 해야 하는 건가요??
: : 어떤식으로 해야 하는지.. 헬프에도 없으니 잘 모르겠습니다.
: :
: : 감사 합니다.
: :
: : 장성호 님이 쓰신 글 :
: : : Data송수신 및 저장은 Thread에서 하시구요
: : :
: : : Image를 그리는것은 GUI쓰레드(메인Thread)에서 하십시요
: : :
: : : Application->ProcessMessages(); 를 이용한다던지..
: : : 꼼수로 while문 for문 사이에
: : : Timer이벤트에 들어갈 내용을 넣는것은 바람직 하지 않는것 같습니다.
: : :
: : : 그럼..
: : :
: : :
: : : 한태희 님이 쓰신 글 :
: : : : 안녕하세요~
: : : :
: : : : 도움을 요청 합니다.
: : : :
: : : : 프로그램을 구동하는데요..
: : : : 통신과 그래프 그리기에서 문제점이 있네요..
: : : :
: : : : 우선 통신은 타이머를 이용해서 수신 요구를 송신하고요..
: : : : 수신된 데이터를 받아 파일로 저장 합니다.
: : : :
: : : : 그리고 파일에서 데이터를 불러와 image를 이용하여 그래프를 그리는 데요..
: : : : 통신 데이터 저장은 1초당 되어야 하는데, 저장된 데이터가 많을 경우 Image에 그래프를 그리는 동안 타이머가 동작 되질 않으므로 통신이 되질 않아 데이터가 저장이 않됩니다.
: : : :
: : : : 쓰레드를 이용하면 image가 없어지고요.. Q&A를 보다 Image같이 화면 Draw를 서브 쓰레드를 사용 하면 문제가 있다고 하네요..
: : : : Application->ProcessMessages(); 이 문은 그래프가 그려지는게 과정이 보이는 관계로 느려지는 경향이 있어 쓰기 어렵습니다.
: : : :
: : : : 그래프를 그리는 동안이던 어떤 일이 있건(While이나 for문) 데이터 저장은 1초마다 되어야 합니다.
: : : : 어떤 방법을 쓰면 좋을 지 알려 주시면 감사해요~~
: : : :
: : : : 예전에 VB로 ActiveEXE를 사용하여 데이터 저장만되는 프로그램을 만들어 메인 프로그램과 연동하여 구동하는 프로그램을 만들었었습니다.
: : : : BCB에선 어떤 방법을 쓰면 좋을지 아시는 분들은 알려 주세요~
: : : :
: : : : 참고로 BCB는 거의 초보 수준입니다.
: : : :
: : : : 제가 글 쓰는 능력이 별로라 이해가 되셨는지 모르겠군요..
: : : : 읽어 주셔 감사 합니다.
|