PDA

View Full Version : سوال: نحوه استفاده از Thread برای نمایش یک فایل Gif حین یک پروسه طولانی



hamedjim
یک شنبه 02 آبان 1395, 11:21 صبح
برای برنامه ای نیاز به یک کامپوننت تایم‌لاین داشتم که بعد از مطرح کردن در این پست (http://barnamenevis.org/showthread.php?528933-%DA%A9%D8%A7%D9%85%D9%BE%D9%88%D9%86%D9%86%D8%AA%D B%8C-%D9%85%D8%B4%D8%A7%D8%A8%D9%87-%D8%B9%D9%85%D9%84%DA%A9%D8%B1%D8%AF-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%D9%87%D8%A7%DB%8C-%D9%85%DB%8C%DA%A9%D8%B3-%D9%81%DB%8C%D9%84%D9%85-(%D8%AA%D8%A7%DB%8C%D9%85-%D9%84%D8%A7%DB%8C%D9%86)&p=2338051#post2338051)، به این نتیجه رسیدم که خودم بدون استفاده از کامپوننت اون رو انجام بدم. برنامه نوشته شد و حالا یه مشکل کوچیک باقی مونده.
وقتی تایم لاینی ایجاد و تنظیم میشه، مشخصاتش در دیتابیس ذخیره میشه. زمانی که می خوام تایم لاین مورد نظر رو Open کنم، زمان زیادی صرف پردازش اطلاعات و رسم آبحکت ها و پنل ها و ... میشه. برای همین می خوام در زمان ایجاد شدن این موارد، در قسمتی از برنامه، یک فایل انیمیشن به صورت GIF نمایش داده بشه.
اما نمی دونم به چه روشی این رو انجام بدم.
ممنونم میشم سرنخ هایی رو به من بدید

Mahmood_M
دوشنبه 03 آبان 1395, 11:42 صبح
فایل Gif رو نمایش بدید، Thread رو بسازید و Start کنید، در انتهای کار Thread یک Message به فرم بفرستید و پایان کار رو اطلاع بدید، در Handler مربوط به اون Message فایل Gif رو متوقف کنید

hamedjim
چهارشنبه 05 آبان 1395, 08:23 صبح
فایل Gif رو نمایش بدید، Thread رو بسازید و Start کنید، در انتهای کار Thread یک Message به فرم بفرستید و پایان کار رو اطلاع بدید، در Handler مربوط به اون Message فایل Gif رو متوقف کنید
ممنون از راهنمایی. با روند کلی که توضیح دادید، به نظر میرسه به جز یک مورد، مشکل خاصی نداشته باشم.
در Thread مورد نظر، من باید اطلاعاتی رو از بانک دریافت کنم و بر مبنای اون یک یا چند Panel ایجاد کنم. لطفا اگر امکان داره راهنمایی کنید چطور در یک Thread عناصر ویژوال مثل Panel بسازم.

Mahmood_M
شنبه 08 آبان 1395, 00:37 صبح
ساخت و نمایش Panel باید در Thread اصلی برنامه انجام بشه
یک راهش اینه که ساخت Panel رو در یک Procedure جداگانه در Thread قرار بدید و با روشهای Synchronize اون رو اجرا کنید، با استفاده از تابع Synchronize و Anonymous Method ها می تونید درون متد Execute مربوط به Thread به راحتی به صورت زیر این کار رو انجام بدید :


Synchronize(procedure
begin
Create Penel Here ...;
end);


راه دوم اینه که برای رسم Panel به فرم اصلی یک Message ارسال کنید و در Handler اون Panel رو بسازید

hamedjim
یک شنبه 23 آبان 1395, 22:59 عصر
برای قسمتی از کارم در حال سرچ بودم، به این برنامه رسیدم.
به نظرم جالب و کم دردسر اومد. در مواردی که مدت زمان اجرای یک پروسه روند مشخصی نداره، میشه از این Thread استفاده کرد:

143462

اما وقتی استفاده می کنم، گاهی روند اجرای Thread توقف میشه (نوار انیمیشن ثابت باقی می مونه). به نظر شما چرا این اتفاق می افته؟

Mahmood_M
دوشنبه 24 آبان 1395, 01:47 صبح
شما دارید عملیات رو برعکس انجام میدید، یعنی نمایش تصویر رو در Thread انجام میدید و عملیات زمان بر رو در Thread اصلی که در این صورت Thread هیچ کمکی به شما نمی کنه و برعکس ترسیم تصویر در Thread مشکل هم ایجاد می کنه، دقیقا باید برعکس باشه، تمام ترسیم ها باید در Thread اصلی انجام بشه
تصویر رو در Thread اصلی نمایش بدید، Thread جدید رو بسازید و Start کنید، درون Thread ساخته شده عملیات موردنظرتون رو انجام بدید و در انتها به فرم اصلی Message بفرستید که کار Thread تمام شده و در همون Message تصویر رو هم حذف کنید، مثال :

(WaitImg.Picture.Graphic as TGIFImage).Animate := True;
WaitImg.Visible := True;

TSendFileThread.Create(CMD, FName, FSize, True, DM.StoryQuery, False, Handle).Start;
در Message-Handler :


procedure SendFileResult(var Msg : TMessage); message MSG_FILERESULT;

...

procedure TNewStoryFrm.SendFileResult(var Msg: TMessage);
begin
(WaitImg.Picture.Graphic as TGIFImage).Animate := False;
WaitImg.Visible := False;
...
end;

در انتهای OnExecute مربوط به Thread هم با یک PostMessage می تونید پیغام اتمام کار رو به فرم ارسال کنید

khorsandreza
دوشنبه 24 آبان 1395, 15:44 عصر
سلام
متاسفانه مدیریت ترد در دلفی از کلافه کننده ترین کارهاست تمام این روش را من تست کرد یه جا درست کار می کنه و جائی مشکل ساز میشه من مدتی از یک کامپوننت بنام BMDThread استفاده می کنم مشکلی ندارم و رایگان است براتون آپلود کردم استفاده کنید و.....

Mask
دوشنبه 24 آبان 1395, 18:32 عصر
سلام
متاسفانه مدیریت ترد در دلفی از کلافه کننده ترین کارهاست تمام این روش را من تست کرد یه جا درست کار می کنه و جائی مشکل ساز میشه من مدتی از یک کامپوننت بنام BMDThread استفاده می کنم مشکلی دارم و رایگان است براتون آپلود کردم استفاده کنید و.....
به نظرمن برعکس.یکی ار مباحث شیرین در دلفی کار با تردهاست.
بنظر من ،نظر شما کاملا شخصیه

khorsandreza
دوشنبه 24 آبان 1395, 22:05 عصر
به نظرمن برعکس.یکی ار مباحث شیرین در دلفی کار با تردهاست.
بنظر من ،نظر شما کاملا شخصیه

سلام بلی دقیقا و این را هم اضافه باید کرد از تخصصی ترین بخش است بخاطر ان حداقل برای بنده کلافه کننده بود قصد جسارت به دوستان نبود