|
크레브님이 적으게 맞구요 ㅇ_ㅇ
제가 궁금한것은 현업에서 일반적으로 사용하는 모터와 LED의 블록타임 입니다~
크레브 님이 쓰신 글 :
: : m->set_work();
: : while(m->is_done())
: : NULL;
: : show_msg("done");
:
: 이런 구조에서는 모터 동작이 완료될때까지
: while loop에서 기다리고 있는거군요
:
: 이런 방식으로 제어하려면 쓰레드 쓸수 밖에 없습니다.
: 타이머에서 이렇게 기다리면 UI가 멈춰 버리니까요
: 모터 동작이 100 msec가 걸리든 1초가 걸리든 그 시간동안은 메시지 처리가 안됩니다.
:
: 타이머에서 사용하려면 다음과 같이 기다리는 부분(loop)이 없어야 합니다.
:
: m->move();
: if(m->is_done()==true)
: {
: // motion done 처리
: }
: else
: {
: return ; // 또는 다른 루틴 수행
: }
:
: 모션 제어에서 일반 타이머를 쓰는경우도 있고 멀티미디어 타이머를 써서 하는 경우도 있습니다.
: 제대로만 만들면 상관없습니다.
: 다만 가장 권장할 만한 방법이 멀티쓰레드를 이용하는것이죠
:
:
:
:
: 마술감자 님이 쓰신 글 :
: : 궁금한게 생겼네요.
: : 나중에 하드웨어 관련 답변을 달때 참고하고 싶습니다.
: :
: :
: : 대충 아래와 같은 코드 구조겠지요
: :
: : m->set_work();
: : while(m->is_done())
: : NULL;
: : show_msg("done");
: :
: : 작업하는 환경에서의 모터가 어느 수준의 인터페이스를 갖는지 궁금합니다.
: :
: : 일반적인 모터들이 set_work() 또는 is_done()을 호출하고 나서
: : 다시 제어권을 얻는데까지 각각 걸리는 block time이 얼마나 되나요?
: :
: : 전 해당 업종과 관련이 없으니 코드를 봐야만 어떤게 좋은지 판단할 수 있기 때문에..
: : 모터에 작업을 걸고, 끝날때까지의 시간이 아니라, 2가지 함수를 콜하고 되돌려 받기까지 각각의 시간이 궁금합니다.
: :
: : 그리고 LED와 관련된 제어 시간도 알고 싶습니다.
: :
: : phenix 님이 쓰신 글 :
: : : 댓글이 메일로 와서 봤습니다. 마술감자님과 싸우자는 것 아니니 충분히 읽어보고 판단하시길...
: : :
: : : 저는 지난 6년간 motion controller 여러종류를 사용해왔고 지금도 현업에서 일하고 있습니다.
: : : 아마 질문자는 timer에서 while loop를 통해 motion done을 확인했을 겁니다. (소스는 보지 못했지만...)
: : : 질문자는 polling방식과 event방식중 polling방식을 선택했고 이것을 timer안에 while loop를 통해 상태를 파악했겠지요. 그래서 GUI가 원활히 동작하지 않았겠지요...
: : : 저도 질문자와 같은 초보자시절에는 같은 착오를 범했고 그것에 polling 방식에 대한 가장 안정적인 해결방법이 thread를 사용하는 것이고 이는 저 뿐만 아니라 이 업종에 종사하는 대다수의 사람들이 사용합니다.
: : :
: : : 단축구동에서는 마술감자님의 답변처럼 하면 될수도 있습니다. 그러나 2,3,4... 여러축이 구동하게 된다면 그리고 여러 IO와 엮이게 된다면 님의 답변방법으로는 한계에 부딛히게 됩니다.
: : :
: : : 물론 thread를 사용해야 겠다면 당연히 동기화를 알아야 겠지요.
: : : 그러나 이것을 공부하고 말고는 질문자가 선택할 사항입니다.
: : :
: : : 하지만 이러한 방법이 있으나 당신 수준에서는 이정도의 방법을 써라 하는것은 아는자의 논리가 아닐런지요...
: : : 정말 "장기적"으로 질문자를 생각한다면 어느 방법이 맞을까요?
: : :
: : : 그리고 질문자의 의도를 정확히 파악하신다면 질문자의 질문중 "서로 불리할려고 해도 쉽게 안되더군용", "서로 다르게 동작하게끔 하는 방법" 이란것의 의미는 다른 process를 사용하고 싶다는 의미가 아닐런지요.
: : :
: : :
: : :
: : :
: : :
: : : 마술감자 님이 쓰신 글 :
: : : : 쓰레드를 쓰라고 하려면 코드를 정확히 판단하고 답변을 달아야 합니다.
: : : : 모터 관련 코드가 다음과 비슷하다면 쓰레드를 사용하지 않아도 충분히 코딩이 가능합니다.
: : : :
: : : : while(is_done() == false)
: : : : NULL;
: : : :
: : : : 쓰레드를 사용하면 코드가 위와 같던, 아니던 100% 해결은 될 겁니다.
: : : : 그런데 특정 기술이나 패턴을 사용하지 않아도 될 곳에 사용하면 부작용이 더 큽니다.
: : : :
: : : : 멀티 쓰레드를 사용하려면 충분한 학습을 하고 해야 하는데
: : : : 무작정 적용하고, 안되니까 질문 하고, 또 답글 달면 1차적으로 해결 하고 반복하게 됩니다.
: : : : 그 증거로, 바로 위에 질문글이 올라왔지요 [thread내에서 다른 클래스 참조...]
: : : :
: : : : 질문자의 학습수준을 생각해서 답글을 달았으면 좋겠습니다.
: : : :
: : : : 견웅님도 제가 분명히 코드를 더 보여달라고 했는데,
: : : : 마음이 급해서 그러셨겠지만 답변자의 의견을 고려하시는것이 장기적으로 도움이 됩니다.
: : : :
: : : : phenix 님이 쓰신 글 :
: : : : : thread 사용하세요.
: : : : : 이게 정확한 답입니다.
: : : : :
: : : : : GUI에서 (정확히 GUI thread에서)
: : : : : motor의 motion done check하랴 (아마도 님의 while loop의 목적?)
: : : : : GUI LED 구동하랴 정신이 없을 겁니다.
: : : : : motion과 관련된 부분은 thread를 사용하여 GUI를 쉬게 해주세요.
: : : : :
: : : : : 견웅 님이 쓰신 글 :
: : : : : : 이번에 프로제트 하면서 모터를 구동하는 작업을 하게 됐습니다...
: : : : : : 모터보드에서 제공하는 라이브어리를 이용해서 작업을 합니다..
: : : : : : 그런데 문제가 생겨서 음.. 여기에 질문을 올립니다..
: : : : : :
: : : : : : 현재 모토를 구동하면서 문제가 타임으로 해서 함수를 실행합니다.
: : : : : : 모토구동하는 함수인데.. 또다른 타임만들어서 led를 움직이는 작업을 합니다....
: : : : : : 이러한 작업을 하는데 있어.. 문제가 생깁니다...
: : : : : : 둘다 따로 돌아야 하는데.. 현재 모터가 많은 작업을 하면 led가 느리게 움직입니다.
: : : : : : 항상 모터와 같이 움직이는 현상이 발생합니다..
: : : : : : 현재 둘다 동기화가 된것같은데.. 서로 불리할려고 해도 쉽게 안되더군용...
: : : : : : 음.. 현재 모터쪽에 while(0) 이러한 구문이 좀 있습니다.
: : : : : : 그래서 Application->ProcessMessges를 해서 해보왔지만 해결이 안되더군용...
: : : : : : 음... 서로 다르게 동작하게끔 하는 방법이 없나 해서..
: : : : : : 질문드립니다. 많은 의견좀 주세요.. ^^
|