2010-01-18 1 views
3

나는이 코드 조각이 나를 미치게합니다.연결이 끊긴 드라이브에 액세스하는 동안 프로그램이 30 초 동 안 고정됩니다.

FUNCTION DiskInDrive(CONST DriveNumber: Byte): BOOLEAN; 
VAR ErrorMode : Word; 
BEGIN 
    RESULT:= FALSE; 
    ErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS); 
    TRY 
    if DiskSize(DriveNumber) <> -1 { %%%% THIS IS VERY SLOW IF THE DISK IS NOT IN DRIVE !!!!!! } 
    THEN RESULT:= TRUE; 
    FINALLY 
    SetErrorMode(ErrorMode); 
    END; 
END; 

디스크를 사용할 준비가되었는지 (그리고 제공된 드라이브 문자가 유효한 디스크에 해당하는지) 확인합니다. 문제는 연결이 끊어진 네트워크 드라이브 (네트워크 폴더가 드라이브로 매핑 됨)에 액세스하려고하면 약 10-30 초 동결됩니다.

코드는 내가 만든 구성 요소의 생성자에 있습니다.

오래 기다리지 않고 드라이브를 검사하려면 어떻게해야합니까?

+0

수 없습니다. 이는 로컬 및 네트워크 자원 모두에 적용됩니다. 이 질문에 대한 답변을 참조하십시오 : http://stackoverflow.com/questions/1438923/faster-directoryexists-function 별도의 스레드에서이 문제를 해결하십시오 (하나 이상의 장치를 점검하는 경우 스레드 당 하나의 장치) –

답변

3

네트워크 드라이브로 무언가를하면 Windows에서 호출하는 스레드를 잠글 수 있습니다. 네트워크 드라이브에 액세스하려고합니다. Joel Spolsky가 말한 그 중 하나입니다.

가장 좋은 방법은 별도의 스레드에서 드라이브 검사를 수행하여 UI를 잠그지 않는 것입니다. Delphi 2009의 제네릭이나 Jon Schemitz의 MsgWaits 라이브러리는 필요한 멀티 스레딩 코드를 단순화 할 수 있습니다.

5

먼저, 이 있음을 알아야합니다. 캐쉬되지 않은 이동식 미디어에 액세스하는 것은 많은 다른 것들 (드라이버, 제조업체, 미디어 품질, 운영 체제 버전, 서비스 팩, 설치된 바이러스 백신 등)에 의존하는 값 비싼 작업입니다.

일단 방문하면 이 조건에 따라 애플리케이션을 실제로 정지시키지 않아도됩니다. 여기 델파이가 있지만, 내가 무엇을 할 것이라고하는 것은 새로운 TThreadedObject 만들기

  • 이며,이 결과를 얻을 설정/그것의 실행 방법
  • 사용 변수에 DiskInDrive 논리를 넣지 마십시오
  • 활성화/적절한 시각적 컨트롤을 비활성화하십시오.

이 방법을 사용하면 여전히 기다려야하지만 응용 프로그램이 응답하지 않게됩니다. 작업을 취소하는 옵션을 추가 할 수도 있습니다 (작업을 완료하는 데 너무 많은 시간이 소요되는 경우).

1

델파이에서 작업자 스레드로 구성 요소를 만들고이 함수를 호출하거나 생성하는 루틴 호출로 바꿉니다 풀의 작업자 스레드가이 작업을 시작합니다. 그런 다음 코드가 시간 초과되면 FALSE를 반환합니다. 그래서 시간이 초과되면 디스크가 드라이브에 있지 않습니다.

코드가 완료 될 때까지 완료되고 스레드를 풀로 반환합니다.

+0

코드는 다음과 같습니다. 내가 만든 구성 요소의 생성자에 이미 있습니다. – Ampere

관련 문제