2014-12-30 4 views
3

기다릴 수있는 타이머에 대해 이해할 수없는 것이 있습니다. 온라인으로 검색하고 MSDN에 specs를 읽었습니다. stackoverflow (예 : link)에서 찾을 수 있지만 PC가 일시 중단 된 직후 타이머가 작동합니다. 대기 타이머 이해

내가 Windows 7에서 XE5 (64 비트)를 사용하여 작은 테스트 애플 리케이션을 쓴 문제에 집중하고 프로젝트가 여기 복제 시도에 : http://www.codeproject.com/Articles/49798/Wake-the-PC-from-standby-or-hibernation

나는 문제가 나는 시간을 유도하는 방식이라고 생각하지만, 문제를 찾을 수없는 것 같습니다.

는 테스트 응용 프로그램이 (매우 간단)과 같습니다

type 
    TWakeupThread = class(TThread) 
    private 
    FTime:   LARGE_INTEGER; 
    protected 
    procedure  Execute; override; 
    public 
    constructor Create(Time: LARGE_INTEGER); 
    end; 

다음과 같이

enter image description here

내가 스레드 유형을 선언 ...

constructor TWakeupThread.Create(Time: LARGE_INTEGER); 
begin 
    inherited Create(False); 
    FreeOnTerminate:=True; 
    FTime:=Time; 
end; 


procedure TWakeupThread.Execute; 
var 
    hTimer:  THandle; 
begin 
    // Create a waitable timer. 
    hTimer:=CreateWaitableTimer(nil, True, 'WakeupThread'); 
    if (hTimer <> 0) then 
    begin 
    //CancelWaitableTimer(hTimer); 
    if (SetWaitableTimer(hTimer, FTime.QuadPart, 0, nil, nil, True)) then 
    begin 
     WaitForSingleObject(hTimer, INFINITE); 
    end; 
    CloseHandle(hTimer); 
    end; 
end; 

이제 때 "타이머 설정"버튼을 클릭합니다.이 방법으로 파일 시간을 계산하고 th를 만듭니다. 독서.

procedure TForm1.btnSetTimerClick(Sender: TObject); 
var 
    iUTCTime : LARGE_INTEGER; 
    SysTime : _SystemTime; 
    FTime : _FileTime; 
    hHandle : THandle; 
    dt  : TDateTime; 
begin 
    ReplaceDate(dt,uiDate.DateTime); 
    ReplaceTime(dt,uiTime.DateTime); 
    DateTimeToSystemTime(dt, SysTime); 
    SystemTimeToFileTime(SysTime, FTime); 
    LocalFileTimeToFileTime(FTime, FTime); 
    iUTCTime.LowPart := FTime.dwLowDateTime; 
    iUTCTime.HighPart := FTime.dwHighDateTime; 
    TWakeupThread.Create(iUTCTime); 
end; 

이것은 작동하지 않습니다. 타이머는 선택한 시간의 양에 관계없이 시스템이 일시 중단 모드로 들어간 후 2 분 이내에 발사되는 것처럼 보입니다. 내가 잘못하고있는 것에 대한 어떤 조언도 감사 할 것이다.

편집

우리가 때 Waitable 타이머를 검사하자이 흥미 명령 줄 도구를 발견. 명령에서 당신은 입력하여 때 Waitable 타이머의 상태를 "볼"수 있습니다 : 내 타이머가 제대로 설정되고 있는지 확인하려면이 옵션을 사용할 수 있습니다

powercfg -waketimers 

. 또한 PC를 조기에 깨울 때 타이머가 계속 작동하는지 확인할 때도 사용할 수 있습니다.

당신이 (내 경우에는 마우스, 키보드, 네트워크) 최대 절전 모드에서 깨울 수있는 장치의 목록을 얻을 수있는 같은 도구를 사용하여 모든 시스템에서

powercfg -devicequery wake_armed 

테스트 명령 "에서 powercfg을 -

Wake History Count - 1 
Wake History [0] 
    Wake Source Count - 0 

내가 모두 잠을 활성화 및 Windows에서 최대 절전 모드와 모두 몇 초 후에 일어날 것입니다 lastwake "나는 해독하는 방법을 모르는 다음을 반환합니다. 키보드/마우스 동작이 없으며 WOL (wake-on-lan) 요청을이 PC에 보내는 장치가 없습니다.

내가 SetSuspendState를 호출 할 때해야 할 특별한 것이 있는지 궁금합니다.

function SetSuspendState(Hibernate, ForceCritical, DisableWakeEvent: Boolean): Boolean; 
//Hibernate = False : system suspends 
//Hibernate = True : system hibernates 
begin 
    if not Assigned(_SetSuspendState) then 
    @_SetSuspendState := LinkAPI('POWRPROF.dll', 'SetSuspendState'); 
    if Assigned(_SetSuspendState) then 
    Result := _SetSuspendState(Hibernate, ForceCritical, DisableWakeEvent) 
    else 
    Result := False; 
end; 
function LinkAPI(const module, functionname: string): Pointer; 
var 
    hLib: HMODULE; 
begin 
    hLib := GetModuleHandle(PChar(module)); 
    if hLib =0 then 
     hLib := LoadLibrary(PChar(module)); 
    if hLib <> 0 then 
     Result := getProcAddress(hLib, PChar(functionname)) 
    else 
     Result := nil; 
end; 
procedure TForm1.btnSuspendClick(Sender: TObject); 
begin 
    SetSuspendState(True, False, False); 
end; 
+0

타이머가 시스템을 깨우고 있습니까? 타이머를 설정하지 않고 시스템을 일시 중단하면 어떻게됩니까? 또한 문서가 지정한대로 오류를 확인하지 않습니다. SetWaitableTimer가 성공하면 ERROR_NOT_SUPPORTED를 찾습니다. –

+0

wakable 타이머를 쿼리하고 정보를 얻을 수있는 powercfg라는 명령 줄 도구가 있습니다. 명령 프롬프트에서 "powercfg -devicequery wake_armed"는 어떤 장치가 PC를 깨울 수 있는지 보여줍니다. 나는 5 개의 체계가있다; 단 하나는 스스로 (타이머없이) 깨어 난다. – lowrider

+0

@DavidHeffernan 도움에 감사드립니다. 그래서 WaitForSingleObject 전에 GetLastError를 호출하고 결과를 ERROR_NOT_SUPPORTED와 비교합니다. 이것이 올바른 방법일까요? 내 테스트에서 GetLastError는 ERROR_NOT_SUPPORTED를 반환하지 않습니다. – lowrider

답변

3

문제는 델파이 관련이없는 않았거나 어떤 식 으로든 코드 : 여기 내 코드입니다. 이 문제는 Windows 7 기능 ()에 의해 만들어졌으며 WOL을 사용할 때 마법 패킷 이상을 사용할 수 있습니다. Windows가 마법 패킷을 수신 대기하도록 강제하면 문제가 해결됩니다.

MS 링크 :

http://support.microsoft.com/kb/941145는 특히 뭔가 다른 PC를 깨어 난 것을 가능성을 언급 데이비드 헤퍼에 도움을하려고 모든 사람에게 감사드립니다.