2014-09-24 2 views
0

내 논문 Head-Tracking 센서를 기존의 자동차 시뮬레이터 소프트웨어에 연결해야합니다. 자동차 시뮬레이터는 DDE를 통해 TCL 명령을받을 수 있으며 지금까지 통신 채널을 성공적으로 설정했습니다. 아이디어는 센서의 데이터를 사용하여 시뮬레이터 창의 현재 뷰를 조정하는 것입니다.DDE와 함께 사용하기 위해 TCL에서 "ACKs"구현

센서 데이터는 DDE 클라이언트 역할을하는 C++ 응용 프로그램을 사용하여 처리되며 DDE 서버 (시뮬레이터)에 명령 문자열을 보냅니다. Microsoft에서 예를 사용하여 (여기 참조 : http://support.microsoft.com/kb/279721/en-us를) 나는 다음 행으로 명령 문자열을 보내고있다 :

DdeClientTransaction((LPBYTE)hData, 0xFFFFFFFF, hConv, 0L, 0, XTYP_EXECUTE, 
TIMEOUT_ASYNC, NULL); 

다른 기능은 시뮬레이터에 TCL 인터프리터에 전송하는 문자열을 호출 한 후 변수 hData 대표 . 나는 반복적으로 보내고있다 명령 문자열은 시뮬레이터에 독점적이며 다음과 같습니다 경우

"Movie eval {dict set View(0:0) xrot %s; dict set View(0:0) yrot %s; dict set View(0:0) zrot %s;}"

당신이 %s이 headtracker의 요, 피치와 롤에 대한 자리 표시 자입니다 궁금합니다. 모든 것이 올바르게 작동합니다. 그러나 시뮬레이터의 TCL 인터 피터 (intereter)가 때로 속도가 느려지고 전체 시뮬레이터를 교수형에 처하는 느낌을 받았다.

DdeClientTransaction -function은 transaccion이 성공했는지/사용 중인지 여부와 DDE 서버 (시뮬레이터) 스패밍을 피하기 위해이 값을 사용하므로 TCL 인터프리터가되는 것으로 의심됩니다. 느린.

내 질문이 있습니다 : 명령 문자열에 추가 할 수있는 TCL 명령이나 다른 방법으로 인터프리터가 DDE를 통해 다음에받은 명령을 처리 할 수 ​​있습니까? 이전 명령으로 완료되면 명령이 더 대기 상태가됩니다. 최대, 그냥 최신 하나 처리?

나는 update;을 보내는 것을 지적했습니다

"Movie eval {dict set View(0:0) xrot %s; dict set View(0:0) yrot %s; dict set View(0:0) zrot %s; update;}"

더 안정적이지만, 꽤 그것이 무엇을 이해하지 않습니다.

답변

0

update은 이벤트를 처리하는 것입니다. 즉시입니다. 현재 존재하는 모든 이벤트 큐를 배출하고, 다음 이벤트가 대기 상태가 될 때까지 계속 진행합니다. 내부적으로 update은 이라는 API 함수를 감싸는 얇은 래퍼입니다.

대개 권장하지 않습니다. 문제는 update이 처리 스크립트 내에서 다시 발생하게하는 이벤트가 다시 발생하면 update이 다시 실행되고 update 안에 update 내부에 update 내부 ... 쉽게 C 레벨 스택을 빠르게 채울 것입니다. 에 대한 모든 호출이 순환 적으로 Tcl_Eval() ...

으로 전화를 걸고 있습니다. 상황이 느려지는 경우, 이는 일반적으로 이벤트 처리기가 처리하는 데 너무 오래 걸린다는 신호입니다. 가장 좋은 것은입니다. 핸들러가 실행되는 시간을 단축 할 수 있고 이벤트를 시스템으로 푸시하는 속도를 줄일 수도 있습니다. 이렇게하면 작은 스크립트가 실행될 때와 응답으로 다시 그리기가 발생할 때 사이의 최소 시간이 유지됩니다.

하지만 은 매우 어렵습니다. 일 수 있습니다. (나도 몰라 다른 일이 무엇인지에 달려있다.)

재 드로는 일반적으로 이 할 일이 없을 때 유출되는 특별한 이벤트 대기열 인 유휴 이벤트에서 발생한다. 에 의해 재앙 가능성이 적은 상황에서 비트를 따라 강제로 시도해 볼 수 있습니다. updateupdate idletasks으로 변경하면 유휴 이벤트 큐가 소모됩니다. (NB :) after idle을 사용하여 유휴 큐에 추가 할 수 있으며 대부분 그렇게하지 않아도됩니다.) 외부 이벤트 (예 : 아이콘 화 또는 창 크기 조정)로 인해 다시 그리기를 처리하지는 않지만 그럴 수 있습니다. 종종 신속하게 처리하는 것이 덜 중요합니다.

after idle으로 게임을 시도해 볼 수 있다고 생각하지만 불만족 스럽다고 생각됩니다. 나는 실제로 사용하기에 알맞은 몇 가지 장소에 대해서만 알고있다. (그리고 위젯을 구현할 때 저수준을 사용하고있을 때도 마찬가지다.)

+0

의견을 보내 주셔서 감사합니다. 나는''유휴''명령에 대해 조금 읽었으며''after cancel'' 명령도 있음을 알았습니다. 내 "'"Movie eval {...} "''명령에이 둘을 모두 추가 할 수 있습니까? 다음 대기 상태에 대한 명령을 대기열에 넣고 어떤 이유로 든 다음 명령을 받기 전에'' "Movie eval {...}''"명령을 사용하지 않으면 명령을 취소하고 새 명령을 대기열에 넣으시겠습니까? – Skavee

관련 문제