Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Синхронизация приложений 
V
    Опции темы
former
Дата 9.9.2009, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



Что подразумевается под синхронностью.
Предположим, что N компьютеров объединены в сеть через сервер. Требуется, что бы изменение объектов на форме любым пользователем мгновенно происходили у других пользователей. Каким образом это можно реализовать? С чего начать?
Буду благодарен за ссылки.

Это сообщение отредактировал(а) former - 9.9.2009, 22:29


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Fedia
Дата 9.9.2009, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 8
Всего: 13



Первое, что приходит на ум: использование сокетов: TClientSocket & TServerSocket;
Второе: сетевая СУБД, в которую записывать вносимые пользователем изменения. На таймере в каждом открытом приложении считывать эти изменения и отображать их на форме.
Самый простой способ: общая сетевая папка, в ней файл в который записываются изменения. Опять же в таймере их считываем и отображаем на форме. Здесь нужно будет решать проблемы одновременного доступа к файлу. При работе с БД (не версионной типа MySql) такого быть не должно, поскольку там будет действовать принцип: кто последний тот и прав.


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
kami
Дата 9.9.2009, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(former @  9.9.2009,  22:27 Найти цитируемый пост)
Каким образом это можно реализовать? С чего начать?

Переделать любой из доступных исходников чата на TCP "под себя", где вместо пользовательских сообщений будет передаваться информация об изменениях объектов.
Простейшие исходники чатов уже рассчитаны на рассылку "один ко всем", останется только придумать свой протокол обмена, чтобы все участники "чата" понимали, что от них хотят и что они должны сделать.

Уточняющие вопросы:
1. Что подразумевается под объектами?
2. Один из пользователей изменил объект. В это же время (с запаздыванием на несколько микросекунд) этот же объект изменил другой пользователь. Если сеть локальная, то скорее всего положение будет следующим:
- команда от первого пользователя отправляется на сервер.
- команда от второго пользователя отправляется на сервер(для простоты будем именовать их №1 и №2).
- №1 рассылается всем пользователям (в т.ч. и №2, возможно - за исключением №1), они меняют состояние своих объектов.
- №2 отправляется всем пользователям (в т.ч. и №1, возможно - за исключением №2), состояние объектов опять меняется (это будет почти моментально)
Результат:
у пользователя 1 будет состояние от №2 (в принципе, как и положено - команда от 2 поступила чуть-чуть позднее)
у пользователя 2 будет состояние от №1. (это в том случае, если поступающая команда не "дублируется" обратно).

Имхо, это нужно будет предусмотреть как-то...
PM MAIL WWW   Вверх
former
Дата 9.9.2009, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



Fedia, не подходит.
kami
1. Технологическая схема, объектами которой являются задвижки, резервуары и т.д.
Параметрами, которые необходимо передавать, являются физические величины и некоторые другие.
Другими словами это параметры для модели тех. процесса.
2. Каждый пользователь отвечает за свой участок схемы.



--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
kami
Дата 9.9.2009, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



former
Тогда - чат на TCP, вместо сообщений - управляющие команды (пускай даже и текстовые, чтобы меньше переделывать. Типа "Add ZObject XParam=3211 YParam=-12 ZParam=4311". Хоть я и не люблю передавать данные текстом) и всё.
Проблемой будет непосредственно перевод действий в управляющие команды и обратно. Ну и отображение их, хотя это другая история. smile

Это сообщение отредактировал(а) kami - 9.9.2009, 23:22
PM MAIL WWW   Вверх
former
Дата 9.9.2009, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



kami
Цитата(kami @  9.9.2009,  23:20 Найти цитируемый пост)
Проблемой будет непосредственно перевод действий в управляющие команды и обратно.

Я думал так. Мат. модель обрабатывается непосредственно на сервере, а с клиентов передаются в нее изменения. Реакции этих изменений передаются обратно клиенту для визуализации.
Другими словами, если модель оставлять на каждом клиенте, то время на пересчет не будет обеспечивать синхронность. Но как в этом случае реализовать серверную часть, т.е. связать мат. модель с и предачу данных?
Стоит ли создавать отдельную службу для этих целей? Какие технологии использовать?


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
kami
Дата 9.9.2009, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



former,  давайте, все-таки пока отделим котлеты от гарнира (в смысле - мат.модель с ее расчетами от синхронизации приложений)  smile Вообще - мне это представляется так: мат. модель - черный ящик, у которого один вход (к примеру - процедура DoChanges(Changes:string) ) и один выход (событие OnChangesCalculated(VisualChanges:string) ).
В этом случае компонент-сервер чата стыкуется с мат.моделью просто "на ура": сервер чата знает о "черном ящике", что у него есть вход и назначает на себя его выход. При любом сообщении от клиента сервер чата передает данные в процедуру входа мат.модели, а когда та отработала - вызывается событие окончания расчетов. Обработанные данные черного ящика просто рассылаются всем клиентам.

Что будет делать мат.модель в процедуре DoChanges - для сервера чата это маловолнующе. Ну разве что это будут очень долгие вычисления без выхода из этой процедуры, что, конечно, нежелательно, но - обходимо.
PM MAIL WWW   Вверх
former
Дата 9.9.2009, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



kami, меня беспокоит не столько время на расчеты, сколько какой объем данных возможно передавать с помощью чата . Или это будет определяться производительностью сервера и возможностями сети.

Это сообщение отредактировал(а) former - 9.9.2009, 23:59


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
kami
Дата 10.9.2009, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(former @  9.9.2009,  23:56 Найти цитируемый пост)
какой объем данных возможно передавать с помощью чата .

В идеале - неограниченный.
В реальности - в зависимости от того, как написан чат (чат - это условно, просто судя по Вашей задаче, передача данных должна быть организована аналогично его структуре). Но, по всей вероятности - тоже неограниченный, ибо скорее всего ограничения по длине разово передаваемой информации будут заложены явно, что не составит труда для небольшого изменения)

Добавлено через 1 минуту и 1 секунду
Сейчас попробую написать работоспособный пример.
PM MAIL WWW   Вверх
kami
Дата 10.9.2009, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(kami @  10.9.2009,  00:03 Найти цитируемый пост)
Сейчас попробую написать работоспособный пример.

нет, пример будет завтра (вернее, уже сегодня) вечером.
Остановился на раздельной обработке передаваемых/принимаемых данных на сервере, еще немного+пара тестов и будет готово.
PM MAIL WWW   Вверх
kami
Дата 10.9.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Сделал.
Это адаптированные вырезки из более мощного проекта, поддерживающего приоритеты передачи данных, шифрование "на лету" BlowFish-ем и т.д.
Комментариев нет, извините. Если что-то непонятно - спрашивайте.
Тестирование проводилось на:
 - передачу данных в обе стороны
 - адекватное реагирование на разрыв соединения в режиме простоя
 - отсутствие утечек при всех действиях.
Не проводилась проверка (лень, если честно) реакции компонентов на разрыв соединения непосредственно в процессе передачи данных, но думаю - ничего страшного не будет.

Ограничение:
Не стоит (но не значит, что нельзя) передавать данные в несколько сотен мегабайт от сервера клиентам - внутреннее хранилище данных основано на TMemoryStream, что при наличии десятков подключений приведет к задействованию памяти SourceStream.Size*ClientCount. В изначальных компонентах такого ограничения нет.

Передача данных корреспонденту поддерживается несколькими методами (буфер, строка, TStream). Прием - только TStream. При необходимости - расширить на события с приемными буферами других типов несложно. У сервера есть методы "Передать всем" и "передать конкретному".

Особенность:
При передаче данных через TStream сетевой компонент становится его владельцем и САМ уничтожит его. Посему - передали Stream в метод и ЗАБЫЛИ про него.
При приеме - наоборот. Получив TStream из сетевого компонента, владелец ОБЯЗАН его уничтожить.

Пример работы с этими компонентами так же во вложении.

P.S. Надеюсь, что гуру форума также не обойдут вниманием этот файл и подскажут, где в нем есть грабли и т.д.

Это сообщение отредактировал(а) kami - 10.9.2009, 12:59

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  SimpleTCPTransfer.zip 6,28 Kb
PM MAIL WWW   Вверх
former
Дата 10.9.2009, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



kami, спасибо за пример. Посмотреть теперь уже, к сожалению, смогу только в выходные.
По результатам отпишу.


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Akella
Дата 10.9.2009, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата
xxx: "Попробую и обязательно отпишусь" - самое популярное последнее сообщение ветки форума
 бор (с)  smile 
PM MAIL   Вверх
former
Дата 10.9.2009, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



Akella, вроде бы я тебя никогда плюсами в репу не обижал. И kami не обижу, когда тема будет исчерпана. Просто некоторые после повышения в репутацию сваливают из темы и получается висяк.

тише, а то нас THendle за флуд накажет  smile 


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
kami
Дата 10.9.2009, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(former @  10.9.2009,  14:47 Найти цитируемый пост)
 спасибо за пример.

Я бы сказал, что это не пример, а готовый шаблон для реализации Вашей задумки по 
Цитата(former @  9.9.2009,  23:32 Найти цитируемый пост)
Мат. модель обрабатывается непосредственно на сервере, а с клиентов передаются в нее изменения. Реакции этих изменений передаются обратно клиенту для визуализации.


PM MAIL WWW   Вверх
former
Дата 13.9.2009, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



kami, спасибо (+)! Хороший шаблон! Если возникнут какие-нибудь вопросы, то напишу.
Нашел еще вот здесь несколько неплохих статей. Может ком-нибудь будет полезным.

Это сообщение отредактировал(а) former - 13.9.2009, 17:10


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
kami
Дата 13.9.2009, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(former @  13.9.2009,  17:07 Найти цитируемый пост)
kami, спасибо

Да не за что.
Давно уже собирался сделать что-то вроде выложенного здесь для простых задач сетевого обмена, но все руки не доходили. А тут такой случай.
Для полного счастья (мне) осталось их чуть-чуть доработать, дописав пару свойств.

Цитата(former @  13.9.2009,  17:07 Найти цитируемый пост)
Нашел еще вот здесь несколько неплохих статей.

Не знаю почему, но к Indy у меня стойкая аллергия, и чем выше версия - тем больше smile (сразу скажу, что реальных аргументов "против" не имею).
PM MAIL WWW   Вверх
former
Дата 13.9.2009, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



Цитата(kami @  13.9.2009,  19:41 Найти цитируемый пост)
Давно уже собирался сделать что-то вроде выложенного здесь для простых задач сетевого обмена, но все руки не доходили. А тут такой случай.

Думаю, что универсальности в задаче сетевого обмена добиваться нет смысла, т.к. многое определяется конкретными условиями и потребностями. С другой стороны, можно классифицировать типовые задачи и создать для них шаблоны.
Цитата(kami @  13.9.2009,  19:41 Найти цитируемый пост)
Для полного счастья (мне) осталось их чуть-чуть доработать, дописав пару свойств.

О! Это уже интересно.


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
kami
Дата 13.9.2009, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(former @  13.9.2009,  20:36 Найти цитируемый пост)
 универсальности в задаче сетевого обмена добиваться нет смысла

Ну, я бы не был так категоричен smile

Цитата(former @  13.9.2009,  20:36 Найти цитируемый пост)
О! Это уже интересно.

Да ничего интересного. Главное при добавлении не дать доступа непосредственно к Server и Client сокетам (и их составляющим по возможности, особенно - касающихся приема и передачи). Пару свойств для идентификации соединений на server-side (к примеру, IP[ConnectionIndex:integer]:string)
В общем - дело 20 минут.

Это сообщение отредактировал(а) kami - 13.9.2009, 23:15
PM MAIL WWW   Вверх
former
Дата 14.9.2009, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



kami, откомпилированный вариант работает как часы.
Возможно, что это связано с самим компилятором. Я компилирую в D2009. При компиляции предупреждения и сообщения об ошибках не появляются.
Вот мой вариант компиляции.

Это сообщение отредактировал(а) former - 14.9.2009, 22:37

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  Project1.exe 542,00 Kb


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
kami
Дата 14.9.2009, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(former @  14.9.2009,  22:36 Найти цитируемый пост)
Я компилирую в D2009. 

Надо было сразу говорить. У меня D7.
Вроде, единственное, что нужно сделать - заменить везде String на AnsiString. Завтра гляну.
PM MAIL WWW   Вверх
Romikgy
Дата 14.9.2009, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(kami @  14.9.2009,  22:41 Найти цитируемый пост)
заменить везде String на AnsiString.

тогда уж на WideString...


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
former
Дата 14.9.2009, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



Цитата(kami @  14.9.2009,  23:41 Найти цитируемый пост)
Вроде, единственное, что нужно сделать - заменить везде String на AnsiString

Это не помогло. 
Замана PChar на PAnsiChar позволила передать данные, но
user posted image

Это сообщение отредактировал(а) former - 14.9.2009, 23:59


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
kami
Дата 15.9.2009, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(Romikgy @  14.9.2009,  23:48 Найти цитируемый пост)
тогда уж на WideString...

Вот честно - не сталкивался с D2009, посему - могу только предполагать, но думаю, что не везде.
В методах, взаимодействующих с пользователем - да, желательно бы на WideString. Но я так понимаю, что при  этом нужно учитывать, что Length(myWideString)=2*Length(myAnsiString) при копировании из байтовых буферов, к примеру - TStream.Read?

И кстати, какой условной директивой определяется, что это D2009 ?

former, Ваш экзешник вообще ничего не выводит, хотя передача данных между клиентом и сервером идет smile

Это сообщение отредактировал(а) kami - 15.9.2009, 07:38
PM MAIL WWW   Вверх
former
Дата 15.9.2009, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



Цитата(kami @  15.9.2009,  07:30 Найти цитируемый пост)
И кстати, какой условной директивой определяется, что это D2009 ?

Если этот вопрос адресован мне. Лицензией. smile 
Цитата(kami @  15.9.2009,  07:30 Найти цитируемый пост)
former, Ваш экзешник вообще ничего не выводит, хотя передача данных между клиентом и сервером идет smile

Так я об этом и говорил.


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
kami
Дата 15.9.2009, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(former @  15.9.2009,  08:43 Найти цитируемый пост)
Если этот вопрос адресован мне. Лицензией

Не, я немного не про то. smile
Я имел ввиду директивы условной компиляции типа
Код

{$IFDEF VER150}

Чуствую, надо будет поставить на виртуалку 2009, потому что иначе много вопросов возникает...

Это сообщение отредактировал(а) kami - 15.9.2009, 12:40
PM MAIL WWW   Вверх
bems
Дата 15.9.2009, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(kami @  15.9.2009,  12:15 Найти цитируемый пост)
{$IFDEF VER150}
это проверка версии компилятора. А тебе наверное нужно RTLVersion, или вообще SizeOf(Char)

Цитата(kami @  15.9.2009,  07:30 Найти цитируемый пост)
Length(myWideString)=2*Length(myAnsiString)

длина же в символах а не байтах. Так что тут умножение на 2 ни к чему


--------------------
Обижено школьников: 8
PM MAIL   Вверх
kami
Дата 15.9.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(bems @  15.9.2009,  17:01 Найти цитируемый пост)
длина же в символах а не байтах

Я имел ввиду
Цитата(kami @  15.9.2009,  07:30 Найти цитируемый пост)
при копировании ... к примеру - TStream.Read

Потому что стандартный код для D7 (опуская проверки длины строки и размера потока)
Код

SetLength(str, Stream.Size);
Stream.Read(str[1], Length(str));

с учетом

Цитата(bems @  15.9.2009,  17:01 Найти цитируемый пост)
SizeOf(Char)

будет выглядеть как-то так:
Код

len:=Stream.Size;
SetLength(str, len div SizeOf(Char));
Stream.Read(str[1], Len);

???
PM MAIL WWW   Вверх
former
Дата 15.9.2009, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



kami, все, нашел причину. smile 
В модулях компонента поменял String - AnsiString и Char - AnsiChar, а в главном нет. Вот в этом и была загвоздка. Моя вина. smile 


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
kami
Дата 15.9.2009, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(former @  15.9.2009,  20:00 Найти цитируемый пост)
все, нашел причину.

Тоже переделал, протестировал на D2009.
Замена на Ansi коснулась только буферов в private секциях.
Для упрощения использования в примере (при приеме данных) добавил функцию StreamToString

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  SimpleTCPTransfer.zip 6,31 Kb
PM MAIL WWW   Вверх
bems
Дата 15.9.2009, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(kami @  15.9.2009,  19:03 Найти цитируемый пост)
len:=Stream.Size;
SetLength(str, len div SizeOf(Char));
Stream.Read(str[1], Len);

ну да, верно. Если записывалось этим же кодом, скомпилированом в той же версии.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
kami
Дата 15.9.2009, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(bems @  15.9.2009,  21:43 Найти цитируемый пост)
 Если записывалось этим же кодом, скомпилированом в той же версии.

Действительно.
То есть и здесь нужно делать "соглашение о вызовах"... либо и там и там WideString либо AnsiString...
Как все непросто с этим unicode...
PM MAIL WWW   Вверх
bems
Дата 15.9.2009, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



имхо лучше везде записывать unicode, а код продублировать для разный делфей. Ну а там где встроенного нет - преобразовывыть руками. Зато никаких неопределенностей между модулями.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
former
Дата 15.9.2009, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



Цитата(bems @  15.9.2009,  22:14 Найти цитируемый пост)
имхо лучше везде записывать unicode, а код продублировать для разный делфей. Ну а там где встроенного нет - преобразовывыть руками. Зато никаких неопределенностей между модулями. 

Это уже к вопросу о переносимости кода. А если таких сток много и под несколько версий нужно делать.
ИМХО: лучше все же использовать 
Цитата(kami @  15.9.2009,  21:59 Найти цитируемый пост)
"соглашение о вызовах"




--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
bems
Дата 15.9.2009, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Ну и чем же лучше?
Если используется это ваше соглашение (в начале строки есть информация о кодировке), то модуль скампилированый в ansi-версии должен уметь преобразоватьб для себя в ansi. Аналогично уникодный модуль - в уникод (и при этом возникает весьмя явная неопределенность с кодовой страницей, которую тоже нужно включать в соглашение).

В то время как мой вариант (для уникодной версии использовать только встроенные механизмы, а для анси - преобразование) по сложности остаётся полностью "нутри" первого. Это значит что преобразования есть и там и там (только у меня они зависят только от версии дельфи) и нет потерь кодовой страницы.

Добавлено через 3 минуты и 8 секунд
Или (лучше всего) все машины в сети скомпилированы в одной версии. Если есть исключения - это их проблема и им нужно обновиться. И лучше бы этой версией была уникодная.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
former
Дата 16.9.2009, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



Цитата(bems @  15.9.2009,  23:05 Найти цитируемый пост)
Или (лучше всего) все машины в сети скомпилированы в одной версии.

Само собой.
Цитата(bems @  15.9.2009,  23:05 Найти цитируемый пост)
И лучше бы этой версией была уникодная. 

Так оно и есть.
Я имел виду  при создании компонент (для примера).


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1318 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.