#include <LIFE-CMD>
LIFE:command(playerid, params[]) //(command) You command no slash (/)
{
// You code
return true;
}
CMD:mycommand(playerid, params[]) //(mycommand) You command no slash (/)
{
return cmd::command(playerid, params); // So we call the command (/command) from the other command
}
public OnPlayerCommandCall(playerid, cmdtext[])
{
//playerid - ID Player | cmdtext - You Command
return true;
}
public OnPlayerCommandFinish(playerid, cmdtext[], success)
{
//playerid - ID Player | cmdtext - You Command | success - returns true or false, that is, whether there is a command or not
return true;
}
CMD:command(playerid, params[]) // Create command
LIFE:command(playerid, params[]) // Create command
FCMD:command(playerid, params[]) // Create command
FUSION:command(playerid, params[]) // Create command
COMMAND:command(playerid, params[]) // Create command
cmd::command(playerid, params); // Call command of the other command
nice , this seem to be really fast ! gj |
Nice. Actually very nice. Can you give some commands exampels ? |
Hey, can you also do a speed test with YCMD? |
Did you make a non-threaded version of this plugin and check the difference between the two? I suspect that the performance benefic would rather come from the fact that this is a plugin (C++ code by itself executes faster than Pawn) than the fact that you are using threads (I believe it can be even slower than without threads because of synchronization overhead).
P.S. Why do people still bother writing command processors (there are literally tons of them)? I thought everyone uses dialogs nowadays ![]() |
PLUGIN_FUNCTION isnull(AMX* amx, cell* params)
{
return (!(params[0]) || ((params[0] == '\1') && !(params[1])));
}
native isnull(const params[]);
I created a command - "/commands"
if I type "/commands" - the command runs succesfully if I type "/COMMANDS" - the command results to unknown command if I type "/CoMmAnDs" - the command results to unknown command Help with this? Btw, nice plugin. |
LIFE:command(playerid, params[]) //(command) You command no slash (/) { // You code return true; }
read what it says
Код:
LIFE:command(playerid, params[]) //(command) You command no slash (/) { // You code return true; } |
I created a command - "/commands"
if I type "/commands" - the command runs succesfully if I type "/COMMANDS" - the command results to unknown command if I type "/CoMmAnDs" - the command results to unknown command Help with this? Btw, nice plugin. |
Почему это "многопоточные"? Это не делает код быстрее! В частности, вы утверждать, что вы новичок в C + +, но решил использовать то, что по праву считается одним из самых сложных вещей в программировании, чтобы получить права (темы) без понимания на всех, почему она должна быть использована. xeeZ уже касались этого, и я полностью согласен. Это то, что вы делаете: Получить команду в «ЦМД» функции. Передать его в небезопасные очереди (то есть тот, который не может быть использован в многопоточном коде без риска сбоев). Вернуться 1 - вы еще не знаете, если команда действительно существует, но возвращает 1 в любом случае ... Подождите, пока второй поток, чтобы запланированных (неопределенное количество времени). У некоторых тривиальных обработки строк, которые не должны быть на втором потоке, и, вероятно, занимает меньше времени, чем для запуска двух очередей операций, необходимых для перемещения данных между двумя потоками (не говоря уже издержек, связанных с потоками операционной системы). Передайте данные в другое небезопасно очередь, удвоить ваши шансы аварии. Подождите, пока первый поток, чтобы запланирован еще раз. Читать и обрабатывать одной командой, независимо от размера очереди ожидания. Наконец на самом деле команда. Да, и кстати, ваши измерения производительности совершенно неправильно - вы только время первых двух пунктов выше, т.е. время вашего командного процессора требуется, чтобы поместить команду на первую очередь. Вам не проверить, как долго это берет, чтобы фактически выполнить команду, которой все другие процессоры команды 'таймингами делать. В самом деле, из-за того, как ваша система работает, это по определению медленнее, чем все остальные методы, потому что ваш будет по-прежнему внезапная команды с вашей второй стек долго после того, тайминги будут завершены все остальное. Таким образом, чтобы sumarise: Очень опасный код ответственность перед сбой. Новое в C + + можно решить сделать многопоточность. Нет необходимости делать многопоточность (а на самом деле вредит вашей исполнение этого). Полное отсутствие понимания того, что темы, хороши (и то, что они плохо). Неправильное выполнение массово искажение кода. Подводя итог резюме: "Темы" не магия "быстрее" переключателя - они жесткие. Я приду к более мелкие точки после того, как исправить эти. Edit: На самом деле, нет, давайте: Ваша таймингов есть много "формат" звонки в них - вы оценивали, сколько времени выполнения тратится делать те по сравнению с тем, сколько на самом деле провели запуск команд? Это кажется важным фактом знать. Вы испытываете 10 команд - это не много, даже самый маленький мод "стандартам. Вы отключения предупреждений в коде C - всегда плохой знак. Почему ваша основная структура под названием "Игрок" - что это нужно сделать с игроками? Конечно, "command_s" было бы лучше (более внимательно следим за более традиционные C + + именования, хотя это и не требуется, просто хорошая практика). Исходя из этого - просто ужасно именования повсюду. Кроме того, "Длина" вместо "Время". Так много копий объекта! Вы понимаете, что указатели или каким памяти в C работает на всех? "Новый символ []", а затем "Удалить" вместо "удалить []". Почему "Список <AMX *>"? Там никогда не может быть больше 17 (16 filterscripts и режим игры). Подождите, извините, посмотрев более внимательно на ваш код - ваше использование очередей является поточно, потому что вы блокируете на мьютексы везде! Дело в том, что очереди являются безопасными это хорошо, но ваши либеральные использования замок не является - особенно, когда вы заблокировать весь второй поток для всей его исполнение! Остановитесь в качестве замков для короткого времени, сколько возможно! "WaitForSingleObject" это вызов ядра Windows (и я подозреваю, что у вас есть аналогичный вызов в коде Linux), что означает, что это SLOW - вероятно, более медленным, чем все остальное код вместе взятые! "Я + +": использование "+ + я" с итераторы. Я беру назад то, что я только что сказал о коде на самом деле быть потокобезопасными, потому что тогда я перечитываю "ProcessTick" и увидел, что, несмотря на ваши либеральные использования мьютексы и везде, их нет там. Зачем использовать разные имена обратного вызова с любой другой командный процессор, который существует? Почему это резьбовым? Я не могу переоценить этот вопрос! Я, однако, поздравляю вас одно: вы не использовали ", используя STD;", но на самом деле указано, какие части вы хотели, чтобы "использовать"! |