ايران ويج

نسخه‌ی کامل: شبيه سازي وقفه (sleep از نوع ديگش)
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
کد:
function vsleep(milisecond:cardinal):cardinal;
var
cnt,t:cardinal;
begin
result:=0;
t:=GetTickCount;
while true do
begin
cnt:=GetTickCount - t;
result:=cnt;
if cnt = milisecond then break;
end;
end;

مزيت اين Sleep نسبت به Sleep مايكروسافت اينه كه وسط برنامه ها روان تر عمل ميكنه و اگه از thread استفاده كني مي توني مدت زمان تلف شده و باقي مانده sleep رو محاسبه كني.
تازه sleep ش اپن سورسه ولي مال مايكروسافت اين طور نيست Biggrin
حالا بگو ببينم Sleep من بهتره يا مايكروسافت؟ Biggrin
اينطوری يه مدت زمان ميديد تو حلقه الاف بشه... ولی اگه اشتبا نکنم CPU رو به 100% ميرسونه
100% كه نه ولي بهتره تو thread اجرا بشه
مال میکرو سافت که اصلا خوب نیست Biggrin
اینم خوبه فقط باید یه کاریش کنی که cpu رو نبره رو ۱۰۰ درصد
اگه به 100% هم نرسه از تمام منابع CPU که در اختيار برنامه قرار گرفته استفاده ميشه و برنامه حالت freez ميگيره به نظرم حتماً بايد تو تريد قرار بگيره
البته منم هميشه از اين روش واسه sleep کمتر از 1 ثانيه استفاده ميکنم
معمولا تو كد هايي كه داخل ترد اجرا ميشن بايد از اين استفاده كرد.
سعي مي كنم كامل ترش كنم.
اينم ورژن 2 Biggrin
ايراد هايي كه گفتين رو برطرف كردم
ديگه نياز به ترد هم نيست.
کد:
function vsleep(milisecond:cardinal):cardinal;
var
cnt,t,h:cardinal;
Msg:TMsg;
begin
result:=0;
cnt:=0;
t:=GetTickCount;
h:=CreateWindow( '', '',WS_DISABLED, 1,1,1,1, 1,1,0,nil);
while(GetMessage(Msg,h,0,0))and(cnt <> milisecond)do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
cnt:=GetTickCount - t;
result:=cnt;
if cnt = milisecond then break;
end;
end;
می خواهی Message ها در حین کار پردازش بشن Translate نکن و این حرفا بزن
کد:
Application.ProcessMessage;
توي كنسول به مشكل مي خوري يا اينكه حجم ميره بالا
فکر نکنم
همه برنامه ها یک کلاس مجزا از نوع TApplication دارن چه کنسول چه Vcl
خوب یه تست بزن ببینیم حجم خروجی چجوریاست.