Вверх ↑
Разработчик
Ответов: 26151
Рейтинг: 2127
#1: 2008-05-17 14:35:44 ЛС | профиль | цитата
tsdima писал(а):
512 - ни туда, ни сюда

А вот это не я придумал, так и было раньше. Но сейчас поправлю.

А сколько это будет в байтах, мне кажется, что должно быть 65534 плюс 0-й байт и конец строки #0, и тогда получается 65536

------------ Дoбавленo:


tsdima писал(а):
запрашивать функцией GetMailslotInfo

Пожалуй, лучший вариант, но это же только в сервере, в клиенте этого нет, или тоже надо ограничить


------------ Дoбавленo:


Тут фигня получается -- GetMailslotInfo выдает размер столько, сколько прописано в CreateMailslot, если поставить 0 (неограниченный размер), то считывает тоже 0, и чего делать дальше

------------ Дoбавленo:


tsdima писал(а):
потом ещё и внутри if после Sender.Synchronize(SyncExec);

А нафиг не надо в if, только один раз, перед созданием потока, больше он не меняется, специально проверил, но это если как я сделал, с копированием в окончательную переменную, длину которой, устанавливаем по факту чтения.

------------ Дoбавленo:


И не дофига ли резервирование буфера в 64 кб Прикинь, каждый созданный слот будет резервировать 64 кило

------------ Дoбавленo:


Я вот чего накидал, может так лучше будет



function THIMailSlot_Server._OnExec;
var nBytesRead:cardinal;
begin
while not Sender.Terminated do begin
if ReadFile(ms, str[1], MAXWORD, nBytesRead, nil) then begin
SetLength(str,nBytesRead);
s := str;
SetLength(str,MAXWORD);
Sender.Synchronize(SyncExec);
end;
end;
Result := 0;
end;
Тут получается, что в s я копирую уже не 64 кило, а только, сколько приняли, после чего сам буфер str возвращается к исходному размеру и готов в следующем запросе уже принимать данные, а что будет с s уже никого не волнует.

------------ Дoбавленo:


Или все таки, вот так более правильно



function THIMailSlot_Server._OnExec;
var nBytesRead:cardinal;
begin
while not Sender.Terminated do begin
if ReadFile(ms, str[1], MAXWORD, nBytesRead, nil) then begin
SetLength(str,nBytesRead);
Sender.Synchronize(SyncExec);
SetLength(str,MAXWORD);
end;
end;
Result := 0;
end;

Но не получится ли здесь так, что когда я даю комманду на исполнение SyncExec, в SyncExec может произойти задержка в обработке буфера, и наступит время исполнения следующего _OnExec, а буфер-то не определен еще
Я припоминаю, что у себя я такое встречал, когда организовал поток в Com-порту, практически по такой же схеме, но обработчик буфера был очень длинный и тормознутый, в результате, мне пришлось делать промежуточный буфер, как в первом варианте.

------------ Дoбавленo:


Ну что, я добил HDE (HiAsm Date Exchange). Что мне понравилось, так это, практически мгновенная, пересылка очень больших стримов. Картинки размером 1024x768 дольше отрисовывало, чем передавало (теперь понятно, почему Total так шустро вскрывает и передает тексты любой длины).
карма: 22

0
файлы: 1project_hde_1_00.zip [5.9KB] [366]