GetTickCount
توضیحات
مقداری که هر میلیثانیه افزایش مییابه رو برمیگردونه. مقدار مطلق برگشتی تعریف نشده و بین سیستمهای مختلف متفاوته، فقط باید برای مقایسه دو نقطه زمانی استفاده بشه.
مثالها
فقط بذار بازیکن هر 10 ثانیه (10000 میلیثانیه) یک بار دستور رو صدا بزنه:
static gLastCommandUse[MAX_PLAYERS];
public OnPlayerCommandText(playerid, cmdtext[])
{
if (strcmp(cmdtext, "/limited") == 0)
{
if (GetTickCount() - gLastCommandUse[playerid] >= 10000)
{
// Enough time has passed.
SendClientMessage(playerid, COLOUR_ERROR, "Called!");
gLastCommandUse[playerid] = GetTickCount();
}
else
{
SendClientMessage(playerid, COLOUR_ERROR, "Please wait");
}
return 1;
}
return 0;
}
نکتهها
تفاوت مقادیری که GetTickCount
میتونه handle کنه محدود به کمتر از 25 روز (2147483647 میلیثانیه) هست. تا زمانی که رویدادهای مقایسه شده کمتر از این مقدار فاصله داشته باشن این تابع کاملاً کار میکنه با یک نکته کوچیک. به خاطر integer overflow، کد زیر ممکنه کار نکنه:
new start = GetTickCount();
// Long code.
new end = GetTickCount();
if (start + 2000 > end)
{
// The code took less than two seconds.
}
اگه start
خیلی بالا باشه این کد wrap around میشه و ممکنه چک به اشتباه pass بشه. ولی حل کردنش خیلی سادهست:
new start = GetTickCount();
// Long code.
new end = GetTickCount();
if (2000 > end - start)
{
// The code took less than two seconds.
}
فقط با تغییر ترتیب مقایسه به طوری که start
و end
در یک طرف باشن، مشکل کاملاً حل میشه. اونایی که با تغییر فرمول آشنا هستن میدونن که این دو قطعه کد کاملاً معادل هستن، ولی دومی در محاسبات modulo صحیحتره.
تابعهای مرتبط
- Tickcount: uptime واقعی سرور رو میگیره.