PDA

View Full Version : سوال: VirtualTreeView



Mask
یک شنبه 06 بهمن 1392, 14:00 عصر
سلام.
در برنامه مالتی تردی ،زمانی پیش میاد که ممکنه 20 تا ترد خروجیشون رو در Memo موجود append کنند.
مشکلی که دارم ، اینه که ممو خیلی کنده و گاهی وقتی چندین ترد میخاند خروجیشون رو sync کنند، ممو کم میاره.
بعد از تحقیقاتی که انجام دادم، کامپوننت VirtualTreeView رو در فرومهایی برای اینچنین مواردی پیشنهاد داده بودند.
نظر دوستان چیه؟

hadisalahi2
دوشنبه 07 بهمن 1392, 11:06 صبح
خوب این دو تا چه ارتباطی دارن به هم :
Memo VS VirtualTreeView
:متفکر:

یوسف زالی
دوشنبه 07 بهمن 1392, 14:13 عصر
سلام برادر.
من فکر می کنم که :
1- دلیل کندی ارتباط مستقیم داشته باشه با تعداد رفرش های کامپوننت، که با هاید کردن و از اون بهتر کار با StringList مرتفع می شه
2- دلیل هنگ کردن این باشه که قفل گذاری مناسبی صورت نمی گیره که در این صورت باید دید کامپوننت مزبور سیستم قفل گذاری داخلی داره یا نه، این هم با یک CriticalSection ساده حل می شه

در حقیقت مشکل دو تاست اخوی نه یکی.
دلیل این که دوست عزیزمون اون کامپوننت رو به شما معرفی کرده رو هم واقعا نمی دونم، اون مربوط به تری بودن هست، آیتم هاش فرق داره، نود داره و ...

Delphi Coder
سه شنبه 08 بهمن 1392, 03:14 صبح
این مشکل کند بودن در این شرایطی که شما گفتید طبیعیه. کلا به نظر من استفاده از Synchronize کار خوبی نیست. من فکر میکنم بهترین کار اینه که همونطور که دوستمون گفتند یه TStringList بزارید و خروجی Thread ها رو توی اون بنویسید البته که باید CriticalSection تعریف کنید براش.
زمانی که هر Thread ای میخواد خروجی بنویسه به این شکل عمل کنه:


const
WM_OutputReady = WM_USER +1;

StrListCriticalSection.Enter;
MemoStrList.Add('Some Texts');
StrListCriticalSection.Leave;
PostMessage(MainForm.Handle,WM_OutputReady,0,0);


در فرم اصلی برنامتون هم یه هندلر برای این message بنویسید به این شکل:


procedure OnOutputReady(var Msg: Tmessage); message WM_OutputReady;
.
.
.
procedure TMainForm.OnOutputReady(var Msg: Tmessage);
begin
if MemoStrList.Count>0 then
begin
StrListCriticalSection.Enter;
Memo1.Lines.AddStrings(MemoStrList)
MemoStrList.Clear;
StrListCriticalSection.Leave;
end;
end;