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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зависание приложения Delphi 
V
    Опции темы
kami
Дата 24.3.2014, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Vlarim @  24.3.2014,  07:23 Найти цитируемый пост)
Скорее всего надо функцию, которая будет приводить записи к String, а на стороне клиента обратно.

Я бы записывал и считывал в TStream...
Что-то типа
Код

  Stream.Write(rec.fTable, SizeOf(Byte));

  Stream.Write(Length(rec.fCol1), SizeOf(integer)); 
  Stream.Write(rec.fCol1[1], Length(rec.fCol1)*SizeOf(Char)); // пишу прямо в браузере, посему проверок на пустую строку нет.

ну а на клиенте - наоборот, только надо не забыть после считывания длины строки сделать ей SetLength
PM MAIL WWW   Вверх
Vlarim
Дата 24.3.2014, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 21.8.2011

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



Что то не пошло...
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  Data: TStream;
begin
  rec.fCol1:='DataDown';
  Data.Write(rec.fCol1, 50); //пробовал вместо 50 ставить  10 и SizeOf(rec.fCol1), 
  FServer.SendToAll(Data);
end;

Ошибка external exception c000001E
Сейчас изучаю TStream, раньше не приходилось с этим работать.

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


Эксперт
***


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

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



1. объект Data не инициализирован
2. содержимое строки начинается с индекса [1]. Код для записи я привел.

Добавлено @ 12:24
ПыСы. Очень полезно читать, что Delphi пишет в Hints и Warnings при компиляции. В идеале - их вообще не должно быть.

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


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 2
Всего: 459



Цитата(Vlarim @  24.3.2014,  12:57 Найти цитируемый пост)
Сейчас изучаю TStream, раньше не приходилось с этим работать.

  Если что вдруг, у нас есть свой маленький ликбез на тему стримов http://forum.vingrad.ru/articles/topic-211911.html


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Vlarim
Дата 24.3.2014, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 21.8.2011

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



Спасибо за ссылку, правда я уже на раз 7 прочитал и из гугла страниц 40.
Цитата

1. объект Data не инициализирован

TStream - абстрактный, необходимо создавать наследника.
Берем TMemoryStream, т.е. добавляем строку Data:= TMemoryStream.Create;?
Цитата

2. содержимое строки начинается с индекса [1]. Код для записи я привел.

Код

  Stream.Write(rec.fTable, SizeOf(Byte)); // Здесь понятно.
  Stream.Write(Length(rec.fCol1), SizeOf(integer)); // как я понял тут записывается информация о длине rec.fCol1, для чего?
  Stream.Write(rec.fCol1[1], Length(rec.fCol1)*SizeOf(Char)); // тут вроде понятно 

В итоге получилось:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  Data: TMemoryStream;
begin
  Data:= TMemoryStream.Create;
  Data.Write(rec.fTable,SizeOf(Byte));
  Data.Write(rec.fCol1[1], Length(rec.fCol1)*SizeOf(Char)); 
.....
  Data.Write(rec.fCol10[1], Length(rec.fCol10)*SizeOf(Char));
  FServer.SendToAll(Data);
end;

Правда еще на практике не проверял, дома нет Delphi (т.е. исходников)

Это сообщение отредактировал(а) Vlarim - 24.3.2014, 16:02
PM MAIL   Вверх
kami
Дата 24.3.2014, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Почитал справку про короткие строки (давненько не приходилось с ними работать) - код надо переписать...
Во-первых, короткие строки содержат по байту на символ, посему Length*SizeOf(Char) - не актуально и приведет к порче памяти, надо просто Length.
Во-вторых, короткие строки сразу получают в свое распоряжение столько памяти, сколько могут занять + 1 байт на длину, в нашем случае получится 11 байт. То есть - Length тоже не надо smile Правда и записывать их нужно с нулевого индекса, содержащего длину.

Итого получаем на передачу:
Код

Data.Write(rec, SizeOf(TData));
Data.Seek(0, soBeginning);

...
ну и на прием, соответственно - 
Код

Data.Seek(0, soBeginning);
Data.Read(rec, SizeOf(TData));


Вот как-то так...

Добавлено через 1 минуту и 23 секунды
Цитата(kami @  24.3.2014,  19:41 Найти цитируемый пост)
приведет к порче памяти

имелись ввиду юникодные версии Delphi

Добавлено через 2 минуты и 56 секунд
ЗЫ. И от такой красоты хотят избавиться, оставив в Delphi  только один строковый тип...
PM MAIL WWW   Вверх
Vlarim
Дата 25.3.2014, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 21.8.2011

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



Спасибо за ответы.
Пересобрал сервер и клиент.
Сейчас поставил на тест.

Осталось прикрутить что то вроде onConnect и Client IP.

Это сообщение отредактировал(а) Vlarim - 25.3.2014, 09:37
PM MAIL   Вверх
Alexeis
Дата 25.3.2014, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 2
Всего: 459



Цитата(kami @  24.3.2014,  20:41 Найти цитируемый пост)
Во-первых, короткие строки содержат по байту на символ, посему Length*SizeOf(Char) - не актуально и приведет к порче памяти, надо просто Length.

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
kami
Дата 26.3.2014, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Alexeis @  25.3.2014,  21:57 Найти цитируемый пост)
 Мне казалось, что тут как раз смысл стримов в том, чтобы снять необходимость в использовании строк фиксированной длинны. ... ведь уже нет необходимости чтобы в памяти поля шли одно за другим непрерывно. 

В общем случае - абсолютно согласен. Но если поля достаточно мелкие по размеру и ограничения заданы высшими силами (к примеру - поля VARCHAR(10) в БД), то получается очень компактная и, имхо, красивая&понятная запись.

Добавлено через 3 минуты и 18 секунд
Цитата(kami @  26.3.2014,  07:53 Найти цитируемый пост)
красивая&понятная запись.

Хотя, да - если не знать структуру TData, да еще не помнить особенности ShortString (как, например, в моем случае) - то подобный код сразу вызывает опасения smile
PM MAIL WWW   Вверх
Vlarim
Дата 1.4.2014, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 21.8.2011

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



Ну думаю дальше тестировать нет смысла.
Уже понятно, что программа стабильно работает на протяжении почти недели.
Поэтому вопрос считаю решенным.

Но могу добавить:
- В интернете описан только один метод работы (один сервер)<->(много клиентов).
Может конечно плохо искал, но искал долго и упорно. Данный метод я реализовал в своей программе и пол года мучался.
- Метод предоставленный kami, отлично справляется со своей задачей.
(не знаю как насчет недостатков, но побочный эффект есть - если перезапустить сервер, то соединения не рвуться)
- Немного разобрался с потоками и TStream.

Всем ОГРОМНОЕ СПАСИБО!!! 
PM MAIL   Вверх
kami
Дата 1.4.2014, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Vlarim @  1.4.2014,  10:57 Найти цитируемый пост)
Метод предоставленный kami, отлично справляется со своей задачей.

Вообще-то я давал код исключительно для того, чтобы кусок из него можно было адаптировать под stBlocking-режим, дабы не происходило дедлоков.  smile 

Цитата(Vlarim @  1.4.2014,  10:57 Найти цитируемый пост)
- В интернете описан только один метод работы (один сервер)<->(много клиентов).

А какие хотелось бы? Клиент физически не в состоянии открыть несколько соединений, как бы этого ни хотелось. Можно создать много клиентов, положить их в один контейнер и обращаться с ними, как с группой. Но от этого "много клиентов, каждый из которых установил одно соединение" они ни во что другое не превратятся smile

Добавлено через 3 минуты и 11 секунд
Цитата(Vlarim @  1.4.2014,  10:57 Найти цитируемый пост)
(не знаю как насчет недостатков, но побочный эффект есть - если перезапустить сервер, то соединения не рвуться)

Есть утечки памяти. Сейчас не вспомню, где, но есть. Надо в приложение FastMM включить в режиме FullDebugMode и они все вылезут. Одно только помню - если соединения нет, а клиент постоянно что-то пытается отправить, то будет Out of memory, т.к. переполнится внутренний буфер.
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

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

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

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

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

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


 




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


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

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