SA-MP Forums Archive
Порядок обработки кода. - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: Порядок обработки кода. (/showthread.php?tid=338592)



Порядок обработки кода. - White_116 - 30.04.2012

Меня терзают вопросы связанные с порядком обработки тех или иных Callback. Все мы знаем что sa-mp сервер работает в один поток, так каков же порядок Callback-ов - это раз.
Во вторых, идёт перебор игроков for(;; ), если произвести кик игрока то будет ли вызван OnPlayerDisconnect() во время перебора?(думаю что да)
В третьих, идёт перебор игроков for(;; ), может ли в этот промежуток времени выполниться OnPlayerConnect()?(думаю что нет)

Пока единственное что мне известно то, что OnPlayerEnterVehicle() игрока происходит до OnPlayerUpdate().

Хотелось бы узнать эту "структуру".


Re: Порядок обработки кода. - Stepashka - 30.04.2012

Ты в курсе что такое один поток и очередь?


Re: Порядок обработки кода. - White_116 - 30.04.2012

Quote:
Originally Posted by Stepashka
View Post
Ты в курсе что такое один поток и очередь?
Не буду блистать знаниями (мы этим только и занимаемся), мне важна очерёдность вызовов.


Re: Порядок обработки кода. - Stepashka - 30.04.2012

Нет её, по мере поступления задач, ушел игрок с сервера в конец очереди встало OnPlayerDisconnect, в этот момент другой человек садится в машину, в конец встали OnPlayerKeyStateChange и OnPlayerEnterVehicle, сел в машину получили OnPlayerStateChange и все это разбавлено порядочной долей событий OnPlayerUpdate.
Нет и никогда не было четкого порядка, только в случае когда два события результат одного действия, например посадка в машину: OnPlayerKeyStateChange, OnPlayerEnterVehicle и OnPlayerUpdate. Правда в каком порядке точно не скажу, но OnPlayerUpdate 100% первая потому что сперва приходит пакет с информацией о том что человек садится в машину, и уже этот пакет вызывает два других события.


Re: Порядок обработки кода. - White_116 - 30.04.2012

Со вторым разобрался идёт вызов дисконекта.
OnPlayerEnterVehicle, OnPlayerKeyStateChange, OnPlayerUpdate.Потом идёт несколько OnPlayerUpdate(пока игрок сядет в машину) и выполняется OnPlayerStateChange.
- результат посадки в авто.


Re: Порядок обработки кода. - Stepashka - 30.04.2012

Я так полагаю что ты отслеживаешь вызовы после того как будет вызвана OnPlayerEnterVehicle?


Re: Порядок обработки кода. - White_116 - 30.04.2012

Quote:

[18:55:12] Up 12242152
[18:55:12] Up 12242253
[18:55:12] Up 12242354
[18:55:12] Exit
[18:55:12] key
[18:55:12] Up 12242456
[18:55:12] key
[18:55:12] State
[18:55:12] Up 12242880
[18:55:13] Up 12243423
[18:55:13] Up 12243975

сделал логирование, апдейт морозил на 100 мс.


Re: Порядок обработки кода. - Stepashka - 30.04.2012

Code:
[18:55:12] Up 12242354 < пакет с кодом для выхода из машины
[18:55:12] Exit
[18:55:12] key
ну и дальнейшие события результат пакета.


Re: Порядок обработки кода. - White_116 - 30.04.2012

наоборот, OnPlayerEnterVehicle, OnPlayerKeyStateChange, OnPlayerUpdate.
(пойду перепроверю...)


Re: Порядок обработки кода. - Stepashka - 30.04.2012




Re: Порядок обработки кода. - White_116 - 30.04.2012

Код:
public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
	printf("OnPlayerEnterVehicle %d",GetTickCount());
	return 1;
}

public OnPlayerExitVehicle(playerid, vehicleid)
{
    printf("OnPlayerExitVehicle %d",GetTickCount());
	return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
    printf("OnPlayerStateChange %d",GetTickCount());
	return 1;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    printf("OnPlayerKeyStateChange %d",GetTickCount());
	return 1;
}

public OnPlayerUpdate(playerid)
{
    printf("OnPlayerUpdate %d",GetTickCount());
	new tick = GetTickCount()+100;
	for(;;)
	if(GetTickCount()>tick)break;
    
	return 1;
}
Quote:

[20:01:13] OnPlayerUpdate 16203855
[20:01:13] OnPlayerUpdate 16204383
[20:01:14] OnPlayerUpdate 16204898
[20:01:14] OnPlayerEnterVehicle 16205063
[20:01:14] OnPlayerKeyStateChange 16205069
[20:01:14] OnPlayerUpdate 16205069
[20:01:14] OnPlayerUpdate 16205170
[20:01:14] OnPlayerUpdate 16205271
[20:01:14] OnPlayerUpdate 16205372
[20:01:14] OnPlayerKeyStateChange 16205473
[20:01:14] OnPlayerUpdate 16205473
[20:01:15] OnPlayerUpdate 16205574

=/


Re: Порядок обработки кода. - Stepashka - 30.04.2012

Quote:

Как сервер узнает о действиях клиента?
К нему приходит информационный пакет.
Что происходит когда приходит информационный пакет?
Вызывается событие OnPlayerUpdate.

Перед любым действием будет вызываться OnPlayerUpdate, все успокойся.

Да и вообще какая тебе разница в каком порядке что делается на сервере? Даже если сервер будет мультипоточным ты не заметишь разницы в виду того что все что там происходит за время которое человек не способен воспринимать.


Re: Порядок обработки кода. - White_116 - 30.04.2012

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Перед любым действием будет вызываться OnPlayerUpdate, все успокойся.

Да и вообще какая тебе разница в каком порядке что делается на сервере? Даже если сервер будет мультипоточным ты не заметишь разницы в виду того что все что там происходит за время которое человек не способен воспринимать.
Большая разница, от этого зависит работоспособность логических выражений и в частности мода.


Re: Порядок обработки кода. - jhonyxakep - 30.04.2012

Quote:

Даже если сервер будет мультипоточным ты не заметишь разницы в виду того что все что там происходит за время которое человек не способен воспринимать.

Неправда. Представьте, что вы работаете с переменной в одном коллбеке. Фактически для вас эта переменная всегда одна и таже. Тут бац, и другой коллбек изменил переменную, с которой работает первый коллбек. Вот и разница.


Re: Порядок обработки кода. - White_116 - 01.05.2012

Quote:
Originally Posted by jhonyxakep
Посмотреть сообщение
Неправда. Представьте, что вы работаете с переменной в одном коллбеке. Фактически для вас эта переменная всегда одна и таже. Тут бац, и другой коллбек изменил переменную, с которой работает первый коллбек. Вот и разница.
Вот тут-то собака и зарыта, если работать с глобальными переменными.