2013-01-09 6 views
0

이 문제에 대한 도움이 필요합니다.Windows DLL에서 내 보낸 함수가 Windows exe에서 호출 된 대기 시간 또는 컨텍스트 이동 시간

Windows DLL에서 내 보낸 함수가 Windows exe에서 호출 될 때 대기 시간 또는 컨텍스트 이동 시간이 나타납니다.

어떻게 결론을 내렸는가? DLL 내보내기 기능의 대부분은 1 밀리 초 미만으로 완료되는 것으로 나타났습니다. 그러나 때로는 DLL 함수가 호출 될 때부터 반환 될 때까지 포인트를 타임 스탬핑하는 경우도 600mSec입니다. 이것은 슬레이브 측에서 버퍼 오버 플로우 및 데이터 손실을 유발합니다. 실제로 사용하고있는 USB to SPI 변환기입니다. DLL은 USB 피드 인 &을 가져 와서 반대쪽 끝에서 SPI 데이터를 방출합니다. 따라서이 함수가 600mSecs까지 돌아가려면 SPI 슬레이브에 대한 데이터가 느슨합니다. (SPI는 또한 많은 15 MHz의 SPI 속도를 고려하고,이 크기의 & 쓰기를 읽을 수 있지만, 우리는 4 바이트를 읽기)가 15 개 이상의 밀리을하지 않는 DLL의 기능을 프로파일에

.

그렇다면 컨텍스트 이동 시간입니까? 내 exe 자체에 DLL의 코드를 통합하는 것이 도움이 될까요? 내가 볼 수있는 유일한 지연은이 DLL의 함수 호출을 통해서입니다. 내가 선점을 일으킬 수있는 방법이 없으므로 내 응용 프로그램이 Win 7 기계에서 더 많은 CPU 시간을 얻습니다. Visual Studio를 사용하고 있습니다.

좋습니다. 이것에 대한 당신의 도움을 감사하십시오.

감사 Sakul

답변

0

는 600ms의 의문은 DLL로 연결 호출의 결과로서 발생된다. 우리에게 DLL 함수에 대한 코드를 표시하면 도움이 될 것입니다. 이 지연에 대한 더 많은 이유가이 중 하나입니다.

  1. 귀하의 DLL 기능은 실제로 그렇게 오래 걸리는 작업을 수행하고 있습니다. I/O 작업, 로깅, 커널 객체 대기 등 ... 코드를 표시하지 않았으므로 이는 단지 추측 일뿐입니다.

  2. 프로그램이 컴퓨터에서 실행되는 것만이 아닙니다. 앱이 전체 CPU 코어 (또는 전체 프로세서)를 차지하는 경우 시스템의 다른 스레드가 실행될 수 있도록 중단됩니다. 도움이되는지 SetThreadPrioritySetPriorityClass으로 연락 했습니까? REALTIME_PRIORITY_CLASS을 볼 수도 있습니다.

  3. 메모리 부족 및 코드가 페이징되고 페이징되고 있습니다.

DLL을 프로파일 링 도구로 프로파일 링하여 오랜 시간이 걸리는 이유를 확인 했습니까?

+0

감사합니다, 그레이트 제안 Selbie – user1960734

0

감사합니다. Selbie, 답변을 게시했음을 알리는 이메일을 보지 못 했으므로 알려지지 않았으므로 도와 주려고했습니다. 감사합니다

나는 "당신이 SetThreadPriority 및 SetPriorityClass를 호출하여 도움이되는지 확인 했습니까? REALTIME_PRIORITY_CLASS도 볼 수 있습니다." 여전히 REALTIME_PRIORITY_CLASS를 (를) 사용하고 있지만 너무 도움이된다고 생각합니다. (현재 나는 또한 -1

i8_priority = GetThreadPriority ( pDpc-> threadHandle)을 수행하여, 문제의 스레드의 우선 순위로 오는 것을 볼;

  printf("\n 0 (threadHandle:0x%08X) i8_priority = %d \n ", pDpc->threadHandle, i8_priority); 

      SetThreadPriority(
pDpc->threadHandle, 
2); 

) 모두 원래 & 후를 SetThreadPriority를 ​​수행하면 -1 만 제공됩니다.

이유는 무엇입니까? 오류 코드가 있으면 반환해야합니다.

우리가 레이턴시를 보았던 한 가지 이유는 USB 트레이스를 보면 너무 가끔 하드웨어에서 응답을 볼 수 없기 때문에 600mSec, 심지어 4sec까지 걸리는 것입니다. 그래서 이것은 FPGA lads가 조사하고 있습니다 .. 이것은 IO 처리가 DLL에 의해 수행 된 것과 같습니다.

내가 스레드와 클래스 우선 순위를 사용하여 얼마나 도움이되는지 확인하고 싶습니다.

어디 까지나 볼 수 있습니다. 그 외에는 공유하십시오.

감사 톤, 감사 Sakul 굽타

+0

는 SetThreadpriority에 "2"를 통과하지 마십시오. THREAD_PRIORITY_TIME_CRITICAL 또는 THREAD_PRIORITY_HIGHEST를 전달하십시오. 어쨌든 GetLastError()의 값을 검사하여 잘못 된 것의 오류 코드를 가져 오십시오. 내 능력은 pDpc-> threadHandle이 유효하지 않다는 것을 알려줍니다. – selbie