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

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

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

Сообщение 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. Если я купил быстрый проц, то это вовсе не значит что он у меня простаивает и мне его нечем занять.
$teelR@t
Сообщения: 348
Зарегистрирован: 19:14, 30.03.2008
Откуда: Украина
Контактная информация:

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

Сообщение $teelR@t »

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 »

да и железо сервера спокойно выдержит достаточно большую нагрузку без применения кода ассемблера
Ну если Вашему серверу больше некуда тратить процессорное время,то да, конечно можно писать код бездумно, а вот я ценю каждый такт, каждого ядра CPU :)
Мы тут не олимпиадные задачки по программированию решаем
Вижу-вижу, Вы тут фигнёй страдаете :) Видать не поняли зачем задают такие задачки…
Были ли бы ещё какие-либо примеры кодов, можно было бы сравнить и обсудить какой из вариантов тратит процессорное время впустую.
Ваши слова? Я дал Вам пример кода. А теперь пишете:
Я сравнивал с предыдущим примером ;).
А когда же ждать сравнение с моим примером? ;)



P.S. Даже если просто сравнить по количеству написанных символов, то оптимальный код (на любом языке) будет короче, да и копировать память по 10 раз тоже нет смысла, хоть у Вас там супер-сервер :)
$teelR@t
Сообщения: 348
Зарегистрирован: 19:14, 30.03.2008
Откуда: Украина
Контактная информация:

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

Сообщение $teelR@t »

DIGGER писал(а):Ну если Вашему серверу больше некуда тратить процессорное время,то да, конечно можно писать код бездумно, а вот я ценю каждый такт, каждого ядра CPU :)
У Вас не правильное понимание о "бездумном" написании кода. Этот код далеко не бездумно писался, вообще нету кода, который пишется бездумно, как минимум надо подумать где его нарыть, чтобы вставить себе в программу и это всё работало.
DIGGER писал(а):Вижу-вижу, Вы тут фигнёй страдаете :) Видать не поняли зачем задают такие задачки…
Фигнёй в этой ветке форума никто не страдает. Тут обсуждается "Технология создания плагинов и программ-дополнений", в частности как извлеч из потока данные. Мы все хорошо знаем зачем нужны такие задачки, но кол-во времени выделяемое на реальные случаи не позволяет постоянно такие задачи решать при написании программ.
DIGGER писал(а):
Были ли бы ещё какие-либо примеры кодов, можно было бы сравнить и обсудить какой из вариантов тратит процессорное время впустую.
Ваши слова? Я дал Вам пример кода. А теперь пишете:
Я сравнивал с предыдущим примером ;).
А когда же ждать сравнение с моим примером? ;)
Я написал это, потому что Вы сказали, что работа с копией указателя не оптимизированная, а я сравнивал с кодом пользователя joub, а не вообще глобально решение этой задачи. Если бы у меня было время разбираться с Вашим асемблерным кодом, то я бы смог сравнить, но пока что у меня такого кол-ва времени нет. Как только появится, я обязательно его проанализирую.

DIGGER писал(а):P.S. Даже если просто сравнить по количеству написанных символов, то оптимальный код (на любом языке) будет короче, да и копировать память по 10 раз тоже нет смысла, хоть у Вас там супер-сервер :)
Ну сервер у нас далеко не супер-пупер... Более того это довольно старая машинка. На ней притом ещё работает много других приложений и никаких видных зависаний и трат на обработку работы плагина не заметно.
joub
Сообщения: 30
Зарегистрирован: 01:30, 02.04.2010

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

Сообщение joub »

DIGGER писал(а):В таком случае Вы (как и joub) тратите время процессора в пустую :)
а без asm-а !? пожалуйста на с++ кусочек кода обработки ?

Замечу что нам не надо просто "быстро" достать данные из строки, а надо их еще дальше и обрабатывать!
$teelR@t писал(а):Ну как сказать... Во-первых память более оптимизированно юзается,...
я так понимаю вы на Delphi свой проект пишите ? :)
а переменная - это тоже указатель на данные ;), так что просто не вижу смысла ковырять указатели если можно просто создать переменную типа строки и юзать её )) (char *)

ЗЫ: по статистике комп очень редко бывает загружен На 100% - так что пусть работает ;)))
$teelR@t
Сообщения: 348
Зарегистрирован: 19:14, 30.03.2008
Откуда: Украина
Контактная информация:

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

Сообщение $teelR@t »

joub писал(а):я так понимаю вы на Delphi свой проект пишите ? :)
а переменная - это тоже указатель на данные ;), так что просто не вижу смысла ковырять указатели если можно просто создать переменную типа строки и юзать её )) (char *)
Нет, я пишу на C++ Builder ;) .
~Alien~
Сообщения: 39
Зарегистрирован: 19:47, 22.01.2010

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

Сообщение ~Alien~ »

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

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

Сообщение DIGGER »

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

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

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

P.S. и наверное хватит тут холивар разводить: думаю каждый понял друг друга
joub
Сообщения: 30
Зарегистрирован: 01:30, 02.04.2010

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

Сообщение joub »

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

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

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

Сообщение DIGGER »

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

joub писал(а):А если, господа, бороться за быстродействие - то надо начинать с Серверной части и протоколов - но это уже не наша задача, а разработчиков сего сервер-чата.
С серверной? Хе-хе :) Сервер один, а клиентов много! Нужно с клиентов начинать, и как по мне протокол сделать открытым (пусть даже не весь и сразу, может с какими ограничениями) (Только одно но - аналогов у чата не много (а достойных аналогов и того меньше) и зачем им заниматься оптимизацией?! Оно ж и так работает :) [удалено как офтопик])
Maxim Mirgorodsky
Администратор
Сообщения: 6867
Зарегистрирован: 09:56, 27.06.2005

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

Сообщение Maxim Mirgorodsky »

Просьба прекратить с офтопиком и в дальнейшем не уходить от темы.
MrVito
Сообщения: 4
Зарегистрирован: 16:24, 01.07.2010

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

Сообщение MrVito »

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

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

Сообщение dv »

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




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

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

Сообщение MrVito »

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

но куда то всё пропало.
ссылка битая :( , пишет: "Запрошенной темы не существует."
~Alien~
Сообщения: 39
Зарегистрирован: 19:47, 22.01.2010

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

Сообщение ~Alien~ »

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 для работы с полученным массивом данных без его копирования в другой массив.
Закрыто