![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Record и String: Жить им вместе? [D7, XP]
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
Абсолютно нормальное явление.