기다릴 수있는 타이머에 대해 이해할 수없는 것이 있습니다. 온라인으로 검색하고 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;
다음과 같이
내가 스레드 유형을 선언 ...
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;
타이머가 시스템을 깨우고 있습니까? 타이머를 설정하지 않고 시스템을 일시 중단하면 어떻게됩니까? 또한 문서가 지정한대로 오류를 확인하지 않습니다. SetWaitableTimer가 성공하면 ERROR_NOT_SUPPORTED를 찾습니다. –
wakable 타이머를 쿼리하고 정보를 얻을 수있는 powercfg라는 명령 줄 도구가 있습니다. 명령 프롬프트에서 "powercfg -devicequery wake_armed"는 어떤 장치가 PC를 깨울 수 있는지 보여줍니다. 나는 5 개의 체계가있다; 단 하나는 스스로 (타이머없이) 깨어 난다. – lowrider
@DavidHeffernan 도움에 감사드립니다. 그래서 WaitForSingleObject 전에 GetLastError를 호출하고 결과를 ERROR_NOT_SUPPORTED와 비교합니다. 이것이 올바른 방법일까요? 내 테스트에서 GetLastError는 ERROR_NOT_SUPPORTED를 반환하지 않습니다. – lowrider