PDA

View Full Version : حرفه ای: لود فایل های مورد نیاز برنامه در صفحه ی اسپلش



hojjatshariffam
جمعه 23 مهر 1389, 02:44 صبح
سلام به دوستان حرفه ای خودم
اگه متوجه شده باشید برنامه هایی چون فتو شاپ قبل از لود شدن صفحه اصلی در هنگام نمایش فرم اسپلش یک سری از فایل ها و DLL ها رو بارگزاری می کنند که در خود برنامه قراره استفاده بشه
ولی ما برنامه هایی رو که می نویسیم اکثرا هر فرمی که باز میشه اگه فایل یا کامپوننتی رو لازم داشته باشه همون موقع بارگزاری می کنه(حداقل برنامه های من اینجوریه)
من میخوام در فرم اسپلشم این فایل های لازم رو مثل برنامه هایی مانند فتوشاپ ، قبل از اجرای برنامه لود کنم تا هم بعدا برنامم فریز نشه (در هنگام لود فرم های مختلف) و هم فرم اسپلش الکی با یه تایم بی خودی نمایش دادهنشه بلکه مفید باشه
لزوم استفاده از این کار رو زمانی حس کردم که از چندین کامپوننت برای زیباسازی فرم هایم استفاده کردم ، قبلا بدون این کامپوننت ها (مانند Telerik - Klilk- DotNetBar - Janusو غیره) زیاد برا کاربرا این زمان قابل لمس نبود ولی الان خودمو هم درگیر کرده
ممنون میشم یه ایده یا یه پترن برای این کار پیش روی من و بقیه دوستانی که به این مشکل برخوردند بزارید
ممنون

hojjatshariffam
جمعه 23 مهر 1389, 02:47 صبح
توجه داشته باشید که مشکل من طراحی یا طرز استفاده از فرم اسپلش نیست ، بلکه طرز انجام یه کار مهم (لود همه فایل های DLL و کامپوننت ها ) در یه زمانی مانند نمایش فرم اسپلش هستش

flash118
جمعه 23 مهر 1389, 02:48 صبح
با سلام سئوال جالبی هست
دوست عزیز من برای نمونه برنامه هایی که نوشته بودم از ریسمان(thared) استفاده میکردم که خوب بود هم اسپلش برنامه لود می شد و هم پیش نیاز ها اونم اونقده لودش زمان بر نبود و باهم تعامل خوبی دارن امتحانش خالی از لطف نیست

Asad.Safari
جمعه 23 مهر 1389, 02:53 صبح
معمولا زمانیکه این کامپوننت ها یک بار اجرا می شوند برای دفعه بعدی کش می شوند و زودتر از قبل اجرا می شوند و به قول شما فریز نمی شوند. بنابراین یک روش ساده و ابتکاری اینکه همه این کامپیوننت ها تون (یا اکثرشون) رو داخل یک فرم قرار بدید . زمانی که اسپلش اجرا میشه این فرم تو پس زمینه اسپلش بدون اینکه کاربر ببینه لود کنید و ببندید البته توی یک سایز کوچیک . لود شدن و بسته شدن این فرم طبیعتا یک زمانی خواهد برد که این زمان هم می تونه زمان منطقی اسپلشتون بشه : یک جایی زود لود میشه و یک جایی دیر لود میشه و این بستگی به سیستم کاربر خواهد داشت. من این رو برای کریستال ریپورت انجام داده بودم که موثر بود.

موفق باشید

hojjatshariffam
جمعه 23 مهر 1389, 03:21 صبح
معمولا زمانیکه این کامپوننت ها یک بار اجرا می شوند برای دفعه بعدی کش می شوند و زودتر از قبل اجرا می شوند و به قول شما فریز نمی شوند. بنابراین یک روش ساده و ابتکاری اینکه همه این کامپیوننت ها تون (یا اکثرشون) رو داخل یک فرم قرار بدید . زمانی که اسپلش اجرا میشه این فرم تو پس زمینه اسپلش بدون اینکه کاربر ببینه لود کنید و ببندید البته توی یک سایز کوچیک . لود شدن و بسته شدن این فرم طبیعتا یک زمانی خواهد برد که این زمان هم می تونه زمان منطقی اسپلشتون بشه : یک جایی زود لود میشه و یک جایی دیر لود میشه و این بستگی به سیستم کاربر خواهد داشت. من این رو برای کریستال ریپورت انجام داده بودم که موثر بود.

موفق باشید
ممنون از راهنماییتون
خب اینم یه روش جالبه و مفیدیه ولی یه جور کلک زدنه
من دنبال یه راه حل منطقی تر و علمی میگردم که خودم اونارو بارگزاری کنم مثل فتو شاپ
مگر اینکه اونا هم همین کارو بکنند

hojjatshariffam
جمعه 23 مهر 1389, 03:26 صبح
با سلام سئوال جالبی هست
دوست عزیز من برای نمونه برنامه هایی که نوشته بودم از ریسمان(thared) استفاده میکردم که خوب بود هم اسپلش برنامه لود می شد و هم پیش نیاز ها اونم اونقده لودش زمان بر نبود و باهم تعامل خوبی دارن امتحانش خالی از لطف نیست
خب پیش نیاز های برنامه رو چطور با نخ لود می کردین (مثلا یک فایل DLL رو قبل از اینکه لازم باشه) و تضمینی وجود داره که هنوز تو حافظه بمونه (کش بشه)

flash118
جمعه 23 مهر 1389, 03:36 صبح
وای دوست عزیز فکر کنم من منظور شما رو درست متوجه نشدم آلان گرفتم چی مد نظرتون هست یه راه حل خوبی داره یکی از دوستان پیاده سازی کردن بذارید بپرسم براتون میگم که چیکار میکرد

Asad.Safari
شنبه 24 مهر 1389, 15:53 عصر
ممنون از راهنماییتون
خب اینم یه روش جالبه و مفیدیه ولی یه جور کلک زدنه
من دنبال یه راه حل منطقی تر و علمی میگردم که خودم اونارو بارگزاری کنم مثل فتو شاپ
مگر اینکه اونا هم همین کارو بکنند

تجربه من این رو به من نشون میده که :" ساده ترین روش بهترین روش است" .خوب اسم این روش رو شما کلک میخایید بذارید و یا هر چیزی . ولی نمی توانید این را رد کنید که این روش در عین سادگی مشکلی دارد یا پیاده سازی آن غیر ممکن است . اگر روش ساده مشکلی نداشته باشد چرا باید از یک روش پیچیده باید استفاده کرد؟

بزرگترین خاصیت این روش این است که شما زمان اسپلشتون هم فقط یک زمان تعیین شده از قبل نیست. پس از قبل حرفه ای تر است که کار را با یک تایمر اجرا کنید. اگر شما فقط می خواهید مثل فتوشاپ اسم هر کامپوننتی که لود میشه رو اون پایین بنویسید می تونید یک کاری بکنید . هر کامپوننت رو در یک فرم بگذارید . فرم 1 را باز کنید و زمانیکه لود و می شه و بسته می شه اسم اون رو تو پایین بنویسید یعنی این لود شد و بعد فرم 2 ... . با این کار دقیقا معلوم میشه که فلان چیز لود شد ... .

اسرار بر پیدا کردن یک روش پیچیده تر را نمی توانم درک کنم.

موفق باشید

hojjatshariffam
شنبه 24 مهر 1389, 17:34 عصر
اسرار بر پیدا کردن یک روش پیچیده تر را نمی توانم درک کنم.

موفق باشید
من از روش شما هم استفاده کردم و قبلا هم از روش پیشنهادیتون تشکر کردم
من منظورم روش پیچیه تر نیست ، روش بهینه تر و علمی تره
چون با این کار فکر نکنم که هیچ تضمینی برای اینکه این DLL ها تا آخر اجرای برنامه تو حافظه بمونند نیست (البته فکر می کنم)، چون من لایه ی DataAccess ی که خودم نوشتم هم بعد از مدتی برا لوش زمان بر میشه چه برسه به این کامپوننت ها(یعنی وقتی که یه مدت چند دقیقه ای که کاربر برنامه رو استفاده نکنه ، برا استفاده مجدد باز زمان لازم برای کانکت شدن به سرور طولانی میشه ، البته این در شبکه چشم گیر میشه)
من میخوام از روشی استفاده کنم که یک Dll یه طوری همیشه تو حافظه بمونه ، مگر آنکه درکم از این مساله اشتباه باشه

Asad.Safari
یک شنبه 25 مهر 1389, 05:19 صبح
یعنی وقتی که یه مدت چند دقیقه ای که کاربر برنامه رو استفاده نکنه ، برا استفاده مجدد باز زمان لازم برای کانکت شدن به سرور طولانی میشه ، البته این در شبکه چشم گیر میشه

این مسئله مگر در فتوشاپ صادق نیست ؟!؟! شما 20 دقیقه بذار برنامه فتوشاپ پایین بخوابه موقع دوباره بالا آوردنش فریز میشه !!! یا فتوشاپ دوباره اسپلش ظاهر میکنه!؟ برا من که فریز میشه. شما این مورد که فرمودید یک مشکل جدید رو طرح کردید و این ربطی به اسپلش نداره . شما هر طوری به هر روشی اونها را در اول برنامه لود کنی باز هم اگر از کش خارج بشه باز هم فریز خواهد شد .

در اینجا با یک روش دیگر اسپلش را انجام داده است که توش اسمبلی ها رو هم لود میکنه و خودش هم برا هر کدوم پیغام میده . و به قول شما یک روش علمی تر هستش :

http://www.codeproject.com/KB/dialog/DGDevSplashScreen.aspx

موفق باشید

hojjatshariffam
یک شنبه 25 مهر 1389, 16:03 عصر
در اینجا با یک روش دیگر اسپلش را انجام داده است که توش اسمبلی ها رو هم لود میکنه و خودش هم برا هر کدوم پیغام میده . و به قول شما یک روش علمی تر هستش :

http://www.codeproject.com/KB/dialog/DGDevSplashScreen.aspx

موفق باشید

برای لود قبل از موعد اسمبلی هاتون در فرم اسپلش ابتدا از لینک بالا که دوستمون معرفی کردند خود صفحه اپلش و دموی استفاده آنرا دانلود کنید (تشکر از برنامه نویسش یادتون نره) کد هائی که در پروژه دمو وجود داره رو به کلاس Program پروژه خودتون کپی کنید با این تفاوت که متغیر currentDomain رو بصورت سراسری در کلاس Program تعریف کرده (می تونید تصویر پس زمینه رو هم خودتون تعیین کنید و اعلان های مناسب دیگه و ...) و سپس در متد LoadConfigData چند دیگه با اسم اسمبلی هاتون که می خواین قبلا لود بشن رو درج کنید
به این صورت

currentDomain.Load("Klik.Windows.Forms.EntryLib.V2.2008");
currentDomain.Load("ActiveReports6");
currentDomain.Load("ActiveReports.Document");
currentDomain.Load("ActiveReports.Viewer6");
currentDomain.Load("ActiveReports.XlsExport");
currentDomain.Load("AnalogClock");
...
..
.

من که استفاده کردم سرعت لود برنامه بهتر شد ، نمی دونم که کارم بهینه است یا استفاده از AppDomain صحیح نمی باشد؟
از دوستمون SIR_asad هم نهایت تشکر رو دارم.

payman_xxp
سه شنبه 04 آبان 1389, 12:00 عصر
سلام دوست عزیز hojjatshariffam
کاش میشد یه نمونه کوچیک از راهنمایی که فرمودید اینجا بزارید.
پیروز باشید