Технология создания плагинов и программ-дополнений

Здесь обсуждаются графические оболочки, боты, языковые файлы и другие дополнения к CommFort 4.
Аватара пользователя
DIGGER
Сообщения: 264
Зарегистрирован: 13:46, 15.05.2009

Re: Технология создания плагинов и программ-дополнений

Сообщение DIGGER » 17:52, 29.06.2010

Во-первых память более оптимизированно юзается

Да Вы что? Вам дают кусок памяти, Вы копируете его по частям (о ужас!) и это у Вас "оптимизированно"?
Так скопируйте ещё разков 100 память с места на место, если так лучше по Вашему :x

сравнивать собственно не с чем

Вот сравните:

Код: Выделить всё

      .IF ShowIP==1
       MOV    EAX,20202020h
       MOV    DWORD PTR[StrIP   ],EAX ; заполняем пробелами
       MOV    DWORD PTR[StrIP+ 4],EAX
       MOV    DWORD PTR[StrIP+ 8],EAX
       MOV    EAX,09202020h
       MOV    DWORD PTR[StrIP+12],EAX

       ; копируем с bMessage в StrIP
       MOV    EAX,[bMessage]
       MOV    ECX,[EAX]    ; Размер "Имя пользователя"
       ADD    EAX,4
       ADD    EAX,ECX
       MOV    ECX,[EAX]    ; Размер "IP адресс"
       PUSH   ECX ; dwCount
       ADD    EAX,4
       PUSH   EAX            ; "IP адресс"
       LEA    EAX,DWORD PTR[StrIP]
       PUSH   EAX ; pDest
       CALL RtlMoveMemory

       ; копируем с StrIP в CommFort_msg
       PUSH   LENGTHOF StrIP;16
       LEA    EAX,DWORD PTR[StrIP]
       PUSH   EAX ; pSrc
       LEA    EAX,DWORD PTR [CommFort_msg+16]
       ADD    EAX,DWORD PTR [CommFort_msg+12]
       PUSH   EAX ; pDest
       CALL RtlMoveMemory
       ADD    DWORD PTR [CommFort_msg+12],LENGTHOF StrIP;16; Добавляем к размеру посылаемого текста
      .ENDIF

Работаем с полученным указателем (bMessage) на память (без всяких нулей в конце), копируем память только один раз и сразу на своё финальное место в выходной строке (CommFort_msg)

P.S. Если я купил быстрый проц, то это вовсе не значит что он у меня простаивает и мне его нечем занять.

$teelR@t
Сообщения: 348
Зарегистрирован: 19:14, 30.03.2008
Откуда: Украина
Контактная информация:

Re: Технология создания плагинов и программ-дополнений

Сообщение $teelR@t » 18:45, 29.06.2010

DIGGER писал(а):Да Вы что? Вам дают кусок памяти, Вы копируете его по частям (о ужас!) и это у Вас "оптимизированно"?
Так скопируйте ещё разков 100 память с места на место, если так лучше по Вашему :x
сравнивать собственно не с чем

Вот сравните:

Код: Выделить всё

      .IF ShowIP==1
       MOV    EAX,20202020h
       MOV    DWORD PTR[StrIP   ],EAX ; заполняем пробелами
       MOV    DWORD PTR[StrIP+ 4],EAX
       MOV    DWORD PTR[StrIP+ 8],EAX
       MOV    EAX,09202020h
       MOV    DWORD PTR[StrIP+12],EAX

       ; копируем с bMessage в StrIP
       MOV    EAX,[bMessage]
       MOV    ECX,[EAX]    ; Размер "Имя пользователя"
       ADD    EAX,4
       ADD    EAX,ECX
       MOV    ECX,[EAX]    ; Размер "IP адресс"
       PUSH   ECX ; dwCount
       ADD    EAX,4
       PUSH   EAX            ; "IP адресс"
       LEA    EAX,DWORD PTR[StrIP]
       PUSH   EAX ; pDest
       CALL RtlMoveMemory

       ; копируем с StrIP в CommFort_msg
       PUSH   LENGTHOF StrIP;16
       LEA    EAX,DWORD PTR[StrIP]
       PUSH   EAX ; pSrc
       LEA    EAX,DWORD PTR [CommFort_msg+16]
       ADD    EAX,DWORD PTR [CommFort_msg+12]
       PUSH   EAX ; pDest
       CALL RtlMoveMemory
       ADD    DWORD PTR [CommFort_msg+12],LENGTHOF StrIP;16; Добавляем к размеру посылаемого текста
      .ENDIF

Работаем с полученным указателем (bMessage) на память (без всяких нулей в конце), копируем память только один раз и сразу на своё финальное место в выходной строке (CommFort_msg)

P.S. Если я купил быстрый проц, то это вовсе не значит что он у меня простаивает и мне его нечем занять.

Я сравнивал с предыдущим примером ;). Такое ощущение что мы тут щас обсуждаем программирование микрокалькулятора. Если бы я программировал на асме, то определённо я бы юзал этот код, но так как у меня не достаточно времени для реализации всех функций на асме, то я юзаю C++ ;). Не каждый плагин для комфорта требует настолько низко-уровневое программирование, да и железо сервера спокойно выдержит достаточно большую нагрузку без применения кода ассемблера. Мы тут не олимпиадные задачки по программированию решаем, а пишем плагин для серверного приложения.
Последний раз редактировалось $teelR@t 19:06, 29.06.2010, всего редактировалось 1 раз.

Аватара пользователя
DIGGER
Сообщения: 264
Зарегистрирован: 13:46, 15.05.2009

Re: Технология создания плагинов и программ-дополнений

Сообщение DIGGER » 19:04, 29.06.2010

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

Ну если Вашему серверу больше некуда тратить процессорное время,то да, конечно можно писать код бездумно, а вот я ценю каждый такт, каждого ядра CPU :)

Мы тут не олимпиадные задачки по программированию решаем

Вижу-вижу, Вы тут фигнёй страдаете :) Видать не поняли зачем задают такие задачки…

Были ли бы ещё какие-либо примеры кодов, можно было бы сравнить и обсудить какой из вариантов тратит процессорное время впустую.

Ваши слова? Я дал Вам пример кода. А теперь пишете:
Я сравнивал с предыдущим примером ;).

А когда же ждать сравнение с моим примером? ;)



P.S. Даже если просто сравнить по количеству написанных символов, то оптимальный код (на любом языке) будет короче, да и копировать память по 10 раз тоже нет смысла, хоть у Вас там супер-сервер :)

$teelR@t
Сообщения: 348
Зарегистрирован: 19:14, 30.03.2008
Откуда: Украина
Контактная информация:

Re: Технология создания плагинов и программ-дополнений

Сообщение $teelR@t » 19:26, 29.06.2010

DIGGER писал(а):Ну если Вашему серверу больше некуда тратить процессорное время,то да, конечно можно писать код бездумно, а вот я ценю каждый такт, каждого ядра CPU :)

У Вас не правильное понимание о "бездумном" написании кода. Этот код далеко не бездумно писался, вообще нету кода, который пишется бездумно, как минимум надо подумать где его нарыть, чтобы вставить себе в программу и это всё работало.

DIGGER писал(а):Вижу-вижу, Вы тут фигнёй страдаете :) Видать не поняли зачем задают такие задачки…

Фигнёй в этой ветке форума никто не страдает. Тут обсуждается "Технология создания плагинов и программ-дополнений", в частности как извлеч из потока данные. Мы все хорошо знаем зачем нужны такие задачки, но кол-во времени выделяемое на реальные случаи не позволяет постоянно такие задачи решать при написании программ.

DIGGER писал(а):
Были ли бы ещё какие-либо примеры кодов, можно было бы сравнить и обсудить какой из вариантов тратит процессорное время впустую.

Ваши слова? Я дал Вам пример кода. А теперь пишете:
Я сравнивал с предыдущим примером ;).

А когда же ждать сравнение с моим примером? ;)

Я написал это, потому что Вы сказали, что работа с копией указателя не оптимизированная, а я сравнивал с кодом пользователя joub, а не вообще глобально решение этой задачи. Если бы у меня было время разбираться с Вашим асемблерным кодом, то я бы смог сравнить, но пока что у меня такого кол-ва времени нет. Как только появится, я обязательно его проанализирую.


DIGGER писал(а):P.S. Даже если просто сравнить по количеству написанных символов, то оптимальный код (на любом языке) будет короче, да и копировать память по 10 раз тоже нет смысла, хоть у Вас там супер-сервер :)

Ну сервер у нас далеко не супер-пупер... Более того это довольно старая машинка. На ней притом ещё работает много других приложений и никаких видных зависаний и трат на обработку работы плагина не заметно.

joub
Сообщения: 30
Зарегистрирован: 01:30, 02.04.2010

Re: Технология создания плагинов и программ-дополнений

Сообщение joub » 22:30, 29.06.2010

DIGGER писал(а):В таком случае Вы (как и joub) тратите время процессора в пустую :)


а без asm-а !? пожалуйста на с++ кусочек кода обработки ?

Замечу что нам не надо просто "быстро" достать данные из строки, а надо их еще дальше и обрабатывать!

$teelR@t писал(а):Ну как сказать... Во-первых память более оптимизированно юзается,...

я так понимаю вы на Delphi свой проект пишите ? :)
а переменная - это тоже указатель на данные ;), так что просто не вижу смысла ковырять указатели если можно просто создать переменную типа строки и юзать её )) (char *)

ЗЫ: по статистике комп очень редко бывает загружен На 100% - так что пусть работает ;)))

$teelR@t
Сообщения: 348
Зарегистрирован: 19:14, 30.03.2008
Откуда: Украина
Контактная информация:

Re: Технология создания плагинов и программ-дополнений

Сообщение $teelR@t » 22:43, 29.06.2010

joub писал(а):я так понимаю вы на Delphi свой проект пишите ? :)
а переменная - это тоже указатель на данные ;), так что просто не вижу смысла ковырять указатели если можно просто создать переменную типа строки и юзать её )) (char *)

Нет, я пишу на C++ Builder ;) .

~Alien~
Сообщения: 39
Зарегистрирован: 19:47, 22.01.2010

Re: Технология создания плагинов и программ-дополнений

Сообщение ~Alien~ » 00:38, 30.06.2010

Соглашусь с DIGGER. Копировать один массив в другой по несколько раз не очень хорошо. Так как сообщения в чат, могут поступать мгновенно по несколько штук и каждый раз разного размера.

Аватара пользователя
DIGGER
Сообщения: 264
Зарегистрирован: 13:46, 15.05.2009

Re: Технология создания плагинов и программ-дополнений

Сообщение DIGGER » 02:11, 30.06.2010

~Alien~, спасибо за поддержку, а то я уже начал думать что и вправду что-то нереальное доказываю :)


joub писал(а):Замечу что нам не надо просто "быстро" достать данные из строки, а надо их еще дальше и обрабатывать!

Смотрите код внимательнее или читайте комментарии коду:
DIGGER писал(а):Работаем с полученным указателем (bMessage) на память (без всяких нулей в конце), копируем память только один раз и сразу на своё финальное место в выходной строке (CommFort_msg)




joub писал(а):ЗЫ: по статистике комп очень редко бывает загружен На 100% - так что пусть работает ;)))

Я не знаю как у Вас там в сети, а вот у себя я борюсь за то что бы когда юзер ввёл адрес и ОТПУСТИЛ Enter, то сайт уже был ПОЛНОСТЬЮ загружен.
И если CPU показывает что загружен на 50% (на 2х ядерном) то это уже не катит + современный CPU это целый конвейер, потому оценивать нагрузку только по графику в диспетчере задач неверно.

P.S. и наверное хватит тут холивар разводить: думаю каждый понял друг друга

joub
Сообщения: 30
Зарегистрирован: 01:30, 02.04.2010

Re: Технология создания плагинов и программ-дополнений

Сообщение joub » 09:33, 30.06.2010

~Alien~", DIGGER - код в студию! языком чесать каждый может - а реальный, рабочий пример показать !?

~Alien~ писал(а):Соглашусь с DIGGER. Копировать один массив в другой по несколько раз не очень хорошо. Так как сообщения в чат, могут поступать мгновенно по несколько штук и каждый раз разного размера.


Идея ясна, но справедлива для сервера - плагин для клиентской части не столь требователен к загрузке и быстродействию.

А если, господа, бороться за быстродействие - то надо начинать с Серверной части и протоколов - но это уже не наша задача, а разработчиков сего сервер-чата.

Аватара пользователя
DIGGER
Сообщения: 264
Зарегистрирован: 13:46, 15.05.2009

Re: Технология создания плагинов и программ-дополнений

Сообщение DIGGER » 16:01, 30.06.2010

joub писал(а):~Alien~", DIGGER - код в студию! языком чесать каждый может - а реальный, рабочий пример показать !?

Пол страницы мало для примера? (Это код из моего плагина) Или непонятно что от меня нужно!


joub писал(а):А если, господа, бороться за быстродействие - то надо начинать с Серверной части и протоколов - но это уже не наша задача, а разработчиков сего сервер-чата.

С серверной? Хе-хе :) Сервер один, а клиентов много! Нужно с клиентов начинать, и как по мне протокол сделать открытым (пусть даже не весь и сразу, может с какими ограничениями) (Только одно но - аналогов у чата не много (а достойных аналогов и того меньше) и зачем им заниматься оптимизацией?! Оно ж и так работает :) [удалено как офтопик])

Maxim Mirgorodsky
Администратор
Сообщения: 6731
Зарегистрирован: 09:56, 27.06.2005
Благодарил (а): 1 раз

Re: Технология создания плагинов и программ-дополнений

Сообщение Maxim Mirgorodsky » 19:12, 30.06.2010

Просьба прекратить с офтопиком и в дальнейшем не уходить от темы.

MrVito
Сообщения: 4
Зарегистрирован: 16:24, 01.07.2010

Re: Технология создания плагинов и программ-дополнений

Сообщение MrVito » 10:15, 02.07.2010

Здравствуйте,
Мне требуется по результатам выполнения программы отослать сообщения пользователям чата.
Я прочитал все ветку но к сожалению так и не понял, как мне подключится к серверу или клиенту комфорта из своей программы (написанной на delphi), что бы отослать сообщение. Растолкуйте мне пожалуйста по шагам, особо признателен буду за пример :)

Аватара пользователя
dv
Сообщения: 1829
Зарегистрирован: 10:28, 11.05.2007
Откуда: localhost
Благодарил (а): 1 раз
Поблагодарили: 2 раза

Re: Технология создания плагинов и программ-дополнений

Сообщение dv » 11:29, 02.07.2010

[Сообщение yдалено]
Последний раз редактировалось dv 18:57, 25.06.2012, всего редактировалось 1 раз.
Дополнения для CommFort
Адрес чата: chat.telered.ru




.

MrVito
Сообщения: 4
Зарегистрирован: 16:24, 01.07.2010

Re: Технология создания плагинов и программ-дополнений

Сообщение MrVito » 12:39, 02.07.2010

dv писал(а):ссылка на исходники -
http://www.commfort.com/rus/forum/viewt ... a&start=45

но куда то всё пропало.


ссылка битая :( , пишет: "Запрошенной темы не существует."

~Alien~
Сообщения: 39
Зарегистрирован: 19:47, 22.01.2010

Re: Технология создания плагинов и программ-дополнений

Сообщение ~Alien~ » 21:37, 02.07.2010

joub вот код:

Код: Выделить всё

void MsgInChannel(BYTE* msg, DWORD len)
{
   char *UserName, *UserIp, *Channel, *Msg;
   int l;

   memcpy(&l, msg, 4);       // читаем размер данных(размер имени пользователя)
   UserName = new char[l];   // выделяем память под указатель для имени пользователя
   msg += 4;                 // перемещаемся на 4 байта
   memcpy(UserName, msg, l); // читаем имя пользователя
   msg += l;                 // перемещаемся на l байтов

   memcpy(&l, msg, 4);       // читаем размер данных(размер IP пользователя)
   UserIp = new char[l];     // выделяем память под указатель для IP пользователя
   msg += 4;                 // перемещаемся на 4 байта
   memcpy(UserName, msg, l); // читаем IP пользователя
   msg += l;                 // перемещаемся на l байтов

   memcpy(&l, msg, 4);       // читаем размер данных(размер названия канала)
   Channel = new char[l];    // выделяем память под указатель для названия канала
   msg += 4;                 // перемещаемся на 4 байта
   memcpy(Channel, msg, l);  // читаем название канала
   msg += l;                 // перемещаемся на l байтов

   memcpy(&l, msg, 4);       // читаем размер данных(размер сообщения)
   Msg = new char[l];        // выделяем память под указатель для сообщения
   msg += 4;                 // перемещаемся на 4 байта
   memcpy(Msg, msg, l);      // читаем сообщение
   msg += l;                 // перемещаемся на l байтов

}

................................................

BYTE WINAPI PluginProcess(DWORD dwMessageID, BYTE* bMessage, DWORD dwMessageLength)
{
   if(dwMessageID == 5)
   {
      MsgInChannel(bMessage, dwMessageLength);
   }

   return 0;
}


Используем указатель bMessage для работы с полученным массивом данных без его копирования в другой массив.

Закрыто