मेरे पास डायरेक्टएक्स-आधारित एप्लिकेशन है। और हाल ही में मैंने पाया कि Now()
फ़ंक्शन मेरे ग्राफिक्स इंजन के मुख्य पाश के भीतर से कॉल होने पर गलत मान देता है। ग्राफिक्स शुरू होने पर मेरे एप्लिकेशन में कॉल होने पर इसे इंजन शुरू करने से पहले एक मूल्य कहा जाता है और अलग-अलग (आमतौर पर 2-3 मिनट पहले या आगे अलग होता है)।डेल्फी अब() फ़ंक्शन एक गलत मान देता है
मुझे पता चला कि Now()
फ़ंक्शन Windows API GetLocalTime()
फ़ंक्शन के लिए एक रैपर है। कोई भी इस बात के बारे में बता सकता है कि इस समारोह के वापसी मूल्य को क्या प्रभावित कर सकता है? मैं अपने ऐप के मुख्य पाश में timeGetTime()
फ़ंक्शन का भारी उपयोग करता हूं, क्या यह समस्या का स्रोत हो सकता है? इसके अलावा मुझे मुख्य लूप में CheckSyncronize()
फ़ंक्शन का उपयोग करने की आवश्यकता है ...
कोई विचार? मैं सुराग से बाहर कर रहा हूँ ... :(मुख्य पाश की
कोड:
procedure Td2dCore.System_Run;
var
l_Msg: TMsg;
l_Point: TPoint;
l_Rect : TRect;
l_Finish: Boolean;
begin
if f_WHandle = 0 then
begin
System_Log('Engine was not started!');
Exit;
end;
if not Assigned(f_OnFrame) then
begin
System_Log('Frame function is not assigned!');
Exit;
end;
// MAIN LOOP
l_Finish := False;
while not l_Finish do
begin
// dispatch messages
if PeekMessage(l_Msg, 0, 0, 0, PM_REMOVE) then
begin
if l_Msg.message = WM_QUIT then
l_Finish := True;
DispatchMessage(l_Msg);
Continue;
end;
GetCursorPos(l_Point);
GetClientRect(f_WHandle, l_Rect);
MapWindowPoints(f_WHandle, 0, l_Rect, 2);
f_MouseOver := f_MouseCaptured or (PtInRect(l_Rect, l_Point) and (WindowFromPoint(l_Point) = f_WHandle));
if f_Active or f_DontSuspend then
begin
repeat
f_DeltaTicks := timeGetTime - f_Time0;
if f_DeltaTicks <= f_FixedDelta then
Sleep(1);
until f_DeltaTicks > f_FixedDelta;
//if f_DeltaTicks >= f_FixedDelta then
begin
f_DeltaTime := f_DeltaTicks/1000.0;
// if delay was too big, count it as if where was no delay
// (return from suspended state for instance)
if f_DeltaTime > 0.2 then
if f_FixedDelta > 0 then
f_DeltaTime := f_FixedDelta/1000.0
else
f_DeltaTime := 0.01;
f_Time := f_Time + f_DeltaTime;
f_Time0 := timeGetTime;
if(f_Time0 - f_Time0FPS < 1000) then
Inc(f_FPSCount)
else
begin
f_FPS := f_FPSCount;
f_FPSCount := 0;
f_Time0FPS := f_Time0;
end;
f_OnFrame(f_DeltaTime, l_Finish);
if Assigned(f_OnRender) then
f_OnRender();
ClearQueue;
{
if (not f_Windowed) and (f_FixedFPS = D2D_FPS_VSYNC) then
Sleep(1);
}
end;
{
else
if (f_FixedDelta > 0) and (f_DeltaTicks+3 < f_FixedDelta) then
Sleep(1);
}
end
else
Sleep(1);
CheckSynchronize;
end;
end;
अब() f_OnFrame()
समारोह में कहीं भी कहा जाता है
यह सब मशीनों पर दुर्व्यवहार करता है? क्या आप इसे एक छोटे नमूना कार्यक्रम में पुन: पेश कर सकते हैं? –
हां। असल में मुझे यह त्रुटि एक बग रिपोर्ट के रूप में मिली। मुझे लगता है कि मैं एक छोटा प्रोग्राम बना सकता हूं लेकिन इसमें मेरे ग्राफिक इंजन को जोड़ने में शामिल होगा ... –
मैंने शीर्ष संदेश में एक मुख्य लूप कोड पोस्ट किया है। –