PDA

View Full Version : جلوگیری از فریز شدن فرم بهنگام لود فایل تکست بزرگ در Memo



seyed_farid
چهارشنبه 17 اسفند 1401, 23:12 عصر
برای اینگه فرم و برنامه بهنگام لود کردن یک فایل Text بزرگ در MEMO فریز نشود چه راهی هست؟

یوسف زالی
پنج شنبه 18 اسفند 1401, 15:16 عصر
ترد Thread

seyed_farid
جمعه 19 اسفند 1401, 11:23 صبح
ممنون از پاسختون.

من برای این کار از ThreadWorker استفاده کردم و با دستور
Memo1.Lines.loadFromFile(FileListBox1.FileName);
در ترد ورکر که این ترید ورکر با OnChange مربوط به FileListBox1 اجرا میشه.
متاسفانه هنوزم فرمم فریز میشه.:متعجب:

یوسف زالی
شنبه 20 اسفند 1401, 19:54 عصر
فایلتون چند گیگه؟

seyed_farid
جمعه 26 اسفند 1401, 00:03 صبح
خیلی بزرگ نیست. در حد چند مگ هست. ولی حدود هفت هشت ثانیه باعث فریز شدن برنامه میشه و این برای برنامه ام خیلی مهمه. چون باید به کلاینتهای شبکه هم درصورت سوال، پاسخدهی کنه. اگه فریز بشه باعث از دست رفتن برخی درخواستها میشه. و نیز برخی کارهای برنامه ریزی شده رو چون با زمان براش تعریف شده ممکنه از دست بده.

یوسف زالی
جمعه 26 اسفند 1401, 11:12 صبح
یک فایل 50 مگی تست کردم، مشکل پیش میاد، ایراد هم نه در خود لود، بلکه در شی لاین کاستوم شده ممو هست، چون همین فایل رو در استریم، یا حتی در StringList لود کردم و زیر یک ثانیه اتفاق می افته.
یک سری پیام ویندوزی رد و بدل می شه که اونها کار رو کند می کنند.
راه حل چیه، به نظرم اگر اجباری در نشون دادن محتوا به یوزر ندارید اون رو در استرینگ لیست لود کنید، اگر هم اجبار وجود داره این کار رو بانچ بانچ انجام بدید و مثلا هربار 1000 خط لود کنید تا کار لود کامل انجام بشه. احتمالا کامپوننت های دیگه ای از شرکت های دیگه موجود باشند که این قسمت رو شخصی سازی کرده باشند برای سرعت بالاتر، ولی سوال اصلی اینه که اصلا چرا ممو؟
مثلا می شه همین دیتا رو در کلاینت دیتاست لود کرد و در گرید نمایش داد.

seyed_farid
جمعه 04 فروردین 1402, 12:29 عصر
سلام
ممنون از محبت و پاسختون :قلب:

من با توجه به اینکه اطلاعات دریافتی روی یک خط که شامل پیامهای متنی هست رو روزانه در یک فایل بصورت متن ذخیره میکنم، برای لود اون متن، فایل مربوطه رو باز میکنم و تو ممو نشون میدم. این کار رو با استفاده از FileListBox انجام میدم و کاربر با کلیک روی فایل، اونو در ممو لود میکنه.
ولی باوجودی که حجمی نداره چند ثانیه (هفت هشت ثانیه) برای لودش برنامم فریز میشه.

یوسف زالی
شنبه 05 فروردین 1402, 09:42 صبح
همون اطلاعات رو در یک مموری تیبل مثل ClientDataSet بریزید و در نهایت در فایل ذخیره کنید، از خود فایل هم به راحتی لود می شه. فرمت XML رو هم ساپورت می کنه.
برای نمایش هم به راحتی در گرید می شه نمایشش داد، سرچ و لوکیت و فیلتر و سایر موارد دیتاست ها رو هم به راحتی روش انجام می دید.

دلفــي
سه شنبه 20 تیر 1402, 08:54 صبح
برای اینگه فرم و برنامه بهنگام لود کردن یک فایل Text بزرگ در MEMO فریز نشود چه راهی هست؟

برای اینکه برنامه در هنگام لود کردن یک فایل text بزرگ در memo، فریز نشود، می‌توانید از روش AsyncLoad یا بارگذاری ناهمزمان استفاده کنید.

روش AsyncLoad، به شما این امکان را می‌دهد که فایل را به صورت ناهمزمان در memo لود کنید. هنگامی که این روش استفاده می‌شود، برنامه شما به صورت Async یا ناهمزمان عمل می‌کند و فریز نمی‌شود.

برای استفاده از روش AsyncLoad، می‌توانید مراحل زیر را دنبال کنید:

1. در فرم یک TTask متغیر ایجاد کنید.


var
FLoadTextTask: ITask<string>;



2. در رویداد OnCreate فرم، کد زیر را بنویسید.



procedure TForm1.FormCreate(Sender: TObject);
begin
// بارگذاری متن فایل ناهمزمان
FLoadTextTask := TTask<string>.Create(
function: string
var
FileStream: TFileStream;
begin
// باز کردن فایل و خواندن محتویات آن
FileStream := TFileStream.Create('path/to/file.txt', fmOpenRead or fmShareDenyNone);
try
SetLength(Result, FileStream.Size div SizeOf(Char));
FileStream.Read(PChar(Result)^, Length(Result) * SizeOf(Char));
finally
FileStream.Free;
end;
end
);
FLoadTextTask.Start;

// ایجاد رویداد بندی برای بارگیری ناهمزمان متن فایل
Application.OnIdle := OnLoadedTextIdle;
end;


3. در رویداد OnIdle فرم، کد زیر را بنویسید.



procedure TForm1.OnLoadedTextIdle(Sender: TObject; var Done: Boolean);
begin
// بررسی آماده‌بودن محتویات فایل برای بارگیری
if FLoadTextTask.Status = TTaskStatus.Completed then
begin
// انتقال محتویات فایل به memo
Memo1.Text := FLoadTextTask.Value;

// حذف رویداد بندی بارگیری ناهمزمان متن فایل
Application.OnIdle := nil;
end;
end;


در این روش، تمام فایل باز می‌شود و محتویات آن به صورت فشرده در Result ذخیره می‌شود. سپس در رویداد OnIdle، بررسی می‌شود آیا محتویات فایل آماده است یا خیر، در صورت آماده‌بودن محتوای فایل، محتویات فایل به memo انتقال داده می‌شود.

یوسف زالی
سه شنبه 20 تیر 1402, 22:11 عصر
مساله اصلا خواندن از فایل نیست، فایل رو لود کنید، زمان ریختن از مموری روی ممو رو تست بگیرید متوجه می شوید