نوشته شده توسط
bmanfy
بله دقیقا این مشکل هست .
که من برای این کار از این روش استفاده کردم .
یک ارایه با طور ثابت(مثلا به طور حداکثر کانکشن هایی که میخوایم با TcpSrver باشه) در نظر میگیریم که قاعدتا هر کدوم یک اندیش دارن . ارایه میتونه از نوع TFileStream و یا MemoryStream باشه . و حتی میتونه اشاره گری باشه به یکی از این دو ساختار .
در مرحله اول که کلاینت اعلام میکنه میخوام برات فایل بفرستم داخل ارایه میگریده و اولین خانه nil رو پیدا میکنه و اندیس اون رو به کلاینت میفرسته . از این به بعد کلاینت در پکت های خود این اندیس رو جای میده و نتیجه سرور میفهمه مال کجاست.
در انتها هم که کارش تمام شد اون محلی که اختصاص داده شده رو free میکنیم. و خانه ارایه رو هم برابر nil قرار میدهیم .
این جوری طول ارایه کم نمیشه دیگه .
البته اگر هم بخواهیم خیلی نگران حافظه باشیم . میتونیم در هر بار که درخواست شد شی حافظه رو بسازیم و اشاره گر به اون رو به کلاینت پس بفرستیم .
نه تفاوتی نداره .چون نهایتاً ما از خصوصیت FileName مربوط به شی FileStream برای مطلع شدن از صحت نام فایل جاری استفاده میکنیم . حالا حتی اگه تعداد اعضای آرایه هم ثابت باشه ، در زمانی که یکی از اشیاء Free بشه در حلقه زیر در قسمتی که مشخص کردم یک استثنا به وجود میاد . علتش هم اینه که شی []FS وجود نداره چون قبلاً Free شده :
for i := low(Fs) to high(Fs) do
begin
if Fs[i].FileName = FileSign then
begin
//Get any part of file
FilePart := copy(CMd, JPos + 3, length(CMd));
Split('`', FilePart, TsL);
//Write the file as bytes
for jj := 0 to TsL.Count - 1 do
begin
AChar := TsL[jj];
AByte := strtoint(AChar);
Ms[i].Write(AByte, 1);
end;
end;
end;
کسی درباره پست های 40 - 41 نظری نداره ؟
خواهش میکنم نظم تاپیک رو رعایت کنید .