برای اینگه فرم و برنامه بهنگام لود کردن یک فایل Text بزرگ در MEMO فریز نشود چه راهی هست؟
برای اینگه فرم و برنامه بهنگام لود کردن یک فایل Text بزرگ در MEMO فریز نشود چه راهی هست؟
ترد Thread
توابع تبدیل تاریخ با دقت 5000 سال
پذیرش پروژه، کامپوننت، آموزش برنامه نویسی (دلفی، اس کیو ال، ..) -> 09123780840
دوستای گلم حمایت کنید : https://cafebazaar.ir/app/com.nikanmehr.marmarxword/
نرم افزار پخش مویرگی
ممنون از پاسختون.
من برای این کار از ThreadWorker استفاده کردم و با دستور
Memo1.Lines.loadFromFile(FileListBox1.FileName);
در ترد ورکر که این ترید ورکر با OnChange مربوط به FileListBox1 اجرا میشه.
متاسفانه هنوزم فرمم فریز میشه.![]()
فایلتون چند گیگه؟
توابع تبدیل تاریخ با دقت 5000 سال
پذیرش پروژه، کامپوننت، آموزش برنامه نویسی (دلفی، اس کیو ال، ..) -> 09123780840
دوستای گلم حمایت کنید : https://cafebazaar.ir/app/com.nikanmehr.marmarxword/
نرم افزار پخش مویرگی
خیلی بزرگ نیست. در حد چند مگ هست. ولی حدود هفت هشت ثانیه باعث فریز شدن برنامه میشه و این برای برنامه ام خیلی مهمه. چون باید به کلاینتهای شبکه هم درصورت سوال، پاسخدهی کنه. اگه فریز بشه باعث از دست رفتن برخی درخواستها میشه. و نیز برخی کارهای برنامه ریزی شده رو چون با زمان براش تعریف شده ممکنه از دست بده.
یک فایل 50 مگی تست کردم، مشکل پیش میاد، ایراد هم نه در خود لود، بلکه در شی لاین کاستوم شده ممو هست، چون همین فایل رو در استریم، یا حتی در StringList لود کردم و زیر یک ثانیه اتفاق می افته.
یک سری پیام ویندوزی رد و بدل می شه که اونها کار رو کند می کنند.
راه حل چیه، به نظرم اگر اجباری در نشون دادن محتوا به یوزر ندارید اون رو در استرینگ لیست لود کنید، اگر هم اجبار وجود داره این کار رو بانچ بانچ انجام بدید و مثلا هربار 1000 خط لود کنید تا کار لود کامل انجام بشه. احتمالا کامپوننت های دیگه ای از شرکت های دیگه موجود باشند که این قسمت رو شخصی سازی کرده باشند برای سرعت بالاتر، ولی سوال اصلی اینه که اصلا چرا ممو؟
مثلا می شه همین دیتا رو در کلاینت دیتاست لود کرد و در گرید نمایش داد.
توابع تبدیل تاریخ با دقت 5000 سال
پذیرش پروژه، کامپوننت، آموزش برنامه نویسی (دلفی، اس کیو ال، ..) -> 09123780840
دوستای گلم حمایت کنید : https://cafebazaar.ir/app/com.nikanmehr.marmarxword/
نرم افزار پخش مویرگی
سلام
ممنون از محبت و پاسختون
من با توجه به اینکه اطلاعات دریافتی روی یک خط که شامل پیامهای متنی هست رو روزانه در یک فایل بصورت متن ذخیره میکنم، برای لود اون متن، فایل مربوطه رو باز میکنم و تو ممو نشون میدم. این کار رو با استفاده از FileListBox انجام میدم و کاربر با کلیک روی فایل، اونو در ممو لود میکنه.
ولی باوجودی که حجمی نداره چند ثانیه (هفت هشت ثانیه) برای لودش برنامم فریز میشه.
همون اطلاعات رو در یک مموری تیبل مثل ClientDataSet بریزید و در نهایت در فایل ذخیره کنید، از خود فایل هم به راحتی لود می شه. فرمت XML رو هم ساپورت می کنه.
برای نمایش هم به راحتی در گرید می شه نمایشش داد، سرچ و لوکیت و فیلتر و سایر موارد دیتاست ها رو هم به راحتی روش انجام می دید.
توابع تبدیل تاریخ با دقت 5000 سال
پذیرش پروژه، کامپوننت، آموزش برنامه نویسی (دلفی، اس کیو ال، ..) -> 09123780840
دوستای گلم حمایت کنید : https://cafebazaar.ir/app/com.nikanmehr.marmarxword/
نرم افزار پخش مویرگی
برای اینکه برنامه در هنگام لود کردن یک فایل 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 انتقال داده میشود.
مساله اصلا خواندن از فایل نیست، فایل رو لود کنید، زمان ریختن از مموری روی ممو رو تست بگیرید متوجه می شوید
توابع تبدیل تاریخ با دقت 5000 سال
پذیرش پروژه، کامپوننت، آموزش برنامه نویسی (دلفی، اس کیو ال، ..) -> 09123780840
دوستای گلم حمایت کنید : https://cafebazaar.ir/app/com.nikanmehr.marmarxword/
نرم افزار پخش مویرگی