Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Record и String: Жить им вместе? [D7, XP]


Страницы:   1 2 3

kirik ©   (2006-09-13 10:26:00) 

Как можно данные из TRecord запихнуть потоком в String? То есть например при получении через сокет  пакета данных проверять если есть определённая датаграмма - то в Trecord, иначе - в String?


Сергей М.   (2006-09-13 13:29:00) [21]

Или ICS.

Или, в кр.случае, TTCPServer/Client.

TServer/ClientSocket для тебя в дан.случае (даже в блок.режиме) вряд ли подойдет.


Сергей М.   (2006-09-13 13:27:00) [22]


> kirik   (13.09.06 13:25) [30]


При твоей подготовке - да, Indy.


kirik   (2006-09-13 13:25:00) [23]

Принципиально упорность в быстродействии - как минимум 5 мб/сек. Есть другие предложения? Indy?


Сергей М.   (2006-09-13 13:22:00) [24]


> kirik   (13.09.06 12:52) [23]


Принципиально ли использование именно TServer/ClientSocket ?


kirik   (2006-09-13 13:18:00) [25]

плин... не умею я:( ...да и нет необходимости из-за 600 записей учиться...


Elen   (2006-09-13 13:13:00) [26]


> kirik

А базами данных работать не хош?


kirik   (2006-09-13 13:09:00) [27]

вторая часть офиса работает через VPN, а у нас канал узковат...

BR, BW я это знаю, только это у меня реализовано для файловой системы а не для сети! Тут дело в том что я не пойму как распознать качество полученных данных...


Elen   (2006-09-13 13:01:00) [28]


> kirik

кстати что твои пользователи настолько удалены что обычное чтение тормозит? или они не в локалке?


Elen   (2006-09-13 12:55:00) [29]


>  ещё желательно универсальную функцию для чтения любых файлов
> по указанному количеству байт

BlockRead, BlockWrite


kirik   (2006-09-13 12:52:00) [30]

ой. звиняюсь. не туда посмотрел:)

может я конечно глупость спрошу... но всё же:

требуется реализация такая:

1. ф-ция SendData(Pos: Integer; Data: TOrganization): Boolean;
возвращает да если была запись нет если не получилось
2. ф-ция RecvData(Pos: Integer): TOrganization;
возвращает прочитанную с запроса на сервере позицию

+ ещё желательно универсальную функцию для чтения любых файлов по указанному количеству байт вроде:

procedure ReadFrom(var Buffer; DataSize, Pos: word);
function WriteTo(const Buffer; DataSize, Pos: word);

у меня они реализованы под файловую систему, а как их запустить в алгоритм чтения из сокетов? в принципе соединение клиента устанавливается при входе, и разрывается только при закрытии программы СУБД..

Как бы это...ну в смысле воспроизвести? Бьюсь неделю - не пойму... Там данные передаются довольно интенсивно (3-4 запроса в секунду), и надо ещё это учесть...ох, голова болит уже...

Тыкните меня носом в ту кучу, где нужно копать...


Сергей М.   (2006-09-13 12:37:00) [31]


> побайтовое чтение?


Какое такое "побайтовое" ?!

Где ты его увидел ?


kirik   (2006-09-13 12:35:00) [32]

побайтовое чтение?


Сергей М.   (2006-09-13 12:12:00) [33]

Клиент:

var
 rec: TOrganization;
 ms: TStream;
..
 ms := TMemoryStream.Create;
 try
   ms.WriteBuffer(rec, SizeOf(rec));
   ms.Position := 0;
   ClientSocket.Socket.SendStream(ms);
 except
  ms.Free;
  raise;
 end;

Сервер:

type
 PRecvData = ^TRecvData;
 TRecvData = packed record
   BytesRead: Integer;
   org: TOrganization;
 end;

событие OnConnect:

Socket.Data := AllocMem(SizeOf(TRecvData));

событие OnDisConnect:

SysFreeMem(Socket.Data);

событие OnRead:

var
 pBuf: ^TOrganization;
 cBytesToRead: Integer;
 cBytesRead: Integer;
..

 pBuf := PRecvData(Socket.Data).org;
 cBytesRead := PRecvData(Socket.Data).BytesRead;
 Inc(PByte(pBuf), cBytesRead);
 cBytesToRead := SizeOf(pBuf^) - cBytesRead;
 cBytesRead := Socket.ReceiveBuf(pBuf^, cBytesToRead);
 if cBytesRead = 0 then Exit;
 Dec(cBytesToRead, cBytesRead);
 cBytesRead := (SizeOf(pBuf^) - cBytesToRead) mod SizeOf(pBuf^));
 PRecvData(Socket.Data).BytesRead := cBytesRead;
 if cBytesRead = 0 then ShowMessage('Принята очерадная структура TOrganization'); //данные которой доступны в ЭТОТ момент в PRecvData(Socket.Data).org


Dmitrij_K   (2006-09-13 11:56:00) [34]

На принимающей стороне заведи глобальный буфер, в него читай из сокета данные, пока его размер не станет >= твоей структуре. Потом из буфера скопируй данные в свой рекорд и удали скопированные данные из временного буфера.


kirik   (2006-09-13 11:40:00) [35]

> Либо на клиенте использовать режим ctBlocking
точно такая же ошибка, да ещё и текст принимать перестал

> грамотно обрабатывать событие OnWrite
брат, я чайник в сокетах!

> либо использовать SendStream
а как потом из него строчку вытаскивать, через StringStream?


kirik   (2006-09-13 11:30:00) [36]

А это не моя организация, стянул с delphi.mastak.ru, пожалуйста, помогите, как правильно организовать? сроки поджимают...


 TOrganization=record

   Name           : String[100];

   AdressIndex    : String[8];
   AdressCity     : String[50];
   AdressStreet   : String[100];
   AdressDom      : String[4];
   AdressOffice   : String[4];
   OfficePhoneC   : String[6];
   OfficePhoneN   : String[8];

   RukovodName    : String[80];
   RukovodPhoneC  : String[6];
   RukovodPhoneN  : String[8];
   RukovodPhoneE  : String[4];
   ExtPhones      : String[110];

   Vajnost        : (vlLow, vlMedium, vlHigh, vlNone);
   VajnostFlag    : (vfRed, vfGreen, vfBlue, vfNone);
   Prozvon        : (psProzvoneno, psNeprozvoneno, psPM);
   Vozrast        : (tsOld, tsNew);
   Obrabotka      : (osObrabotano, osNeobrabotano);
   Prodagi        : (pcLow, pcMedium, pcHigh, pcNone);
   SpecFlag       : (sfRed, sfGreen, sfBlue, sfNone);

   ExtInfoFile    : String[20];    // ext-info filename
   Category       : String[80];
   Region         : String[80];
   IsInHolding    : Boolean;
   HoldingName    : String[100];

   WWW            : String[80];
   Email          : String[80];
 end;


Сергей М.   (2006-09-13 11:24:00) [37]


> То есть файл - file of TOrganization [655x955bytes]
>


Приведи объявление структуры TOrganization


> как бороться?


Либо на клиенте использовать режим ctBlocking, либо грамотно обрабатывать событие OnWrite, либо использовать SendStream

С сервером - отдельная песня. Он у тебя заведомо неправильно организован на приеме.


kirik   (2006-09-13 11:18:00) [38]

>> При попытке быстро передать несколько записей-Async error
Хм. А как бороться? Группировать по N записей и слать скопом?


kirik   (2006-09-13 11:15:00) [39]

То есть файл - file of TOrganization [655x955bytes]


Сергей М.   (2006-09-13 11:14:00) [40]


> kirik   (13.09.06 11:09) [12]


Т.е. файл - текстовый ?


> При попытке быстро передать несколько записей-Async error


Абсолютно нормальное явление.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо