یک مشکل مشخص و ساده اما ....

benyamin_pc

Well-Known Member
در هنگامی که روی دکمه ای کلیک میشه ی سری کار انجام میشه و در آخر باید چندتا فایل که در هنگام نوشتن برنامه معلوم نیست چنتان لود شن و متنشون پشت سره هم تو تکست باکس بیان
پس نمیشه به تعداد هرکدوم یک لودر و یک تابع لود کمپلت داشت . پس باید از یک لودر و یک تابع تو یک حلقه استفاده کرد تا اسامی فایل ها که تو آراینو به ترتیب بذاره تو لودرو محتویاتشو بیاریم تو تکست باکس اما اینجا ی مشکله که همه میدونیم و اون اینه که سرعت انجام حلقه در حده فضائی بالاست و با ی پلک بهم زدن میلیون ها کارو انجام میده و این اینجا بده . چون هنوز قبلی لود نشده میره بعدیو لود کنه و تابع لود کمپلت برای اینکه با فایل و I/O در ارتباط با سرعت واکشی فایل بعدی توی لودر نمیتونه سنکرون باشه و محتویاتا از دست میرن و فقط آخرین فایل که فرصت کافی برای I/O داره لود میشه
برای همین اومدم ته تابع لودم یه متغییر به نامه Mojaveze_load برابر 1 کردم و اول این تیکه کد گفتم هر وقت این متغییر 1 شد اول اینو 0 کن و بعد بیا لودرو مقدار بده و تابع لود جدیدو بساز . اینجوری ی قفل زدم رو زمان لود کمپلت و لود فایل بعدی تا سنکرون شن اما اولا برنامه خیلی طول میکشه تا این کارو بخواد بکنه چون هر بار حلقه شرطش جلو نمیتونه بره و ی کار غیر تکنیکیه و مسائل دیگه ای که هست .. و حالا زمان هیچی اصلا فایل ها رو پشت هم تو تسکت باکس نیاورد که بخاطر همون مشکلی که برای حلقه پیش میاد . اگه ی دستور Goto مثل قدیم ندیما داشتیم حل بود اما خوب نداریم حالا چه باید کرد؟
 

armanbm

کاربر VIP
سلام عزیز.

دوتا راهی که میشه باهاش این کارو انجام داد.
1. استفاده از کلاس loaderMax از سایت greensock.com که خوب یک متد داره به نام .parse() و یک آرایه میگیره و تمام فایل های نوشته شده تو آرایه رو برات لود میکنه. هم تو داکیومنت هاش مثال هست. هم یک کلیپ آموزشی روش استفاده از پارسرش رو گذاشته. خلاصه خیلی ردیفه.


2. اگه بخوای تو همون روشی که خودت داشتی پیش میرفتی کار کنی بنظرم این روش جواب میده.

یک تابع مینویسی مثلا loadIt و یه تابع onLoadItComplete.
برای سادگی توضیح یک متغیر سراسر از نوع عدد داری به اسم _arrayIndex که اولش صفرهک

حالا loadIt رو فراخونی میکنی که از آرایه ای که باید لود شوند، شماره ی _arrayIndex رو لود کن. و وقتی تموم شد onLoadComplete رو اجرا کن.

تو onLoadComplete :
به _arrayIndex یکی اضافه میکنی.
loadIt رو دوباره فراخونی میکنی.
(حواست باشه شرط پایان رو بنویسی که تا عبد اینا همدیگه رو فراخونی نکنند).

همین!
یا حق :)
 

benyamin_pc

Well-Known Member
سلام عزیز.

دوتا راهی که میشه باهاش این کارو انجام داد.
1. استفاده از کلاس loadermax از سایت greensock.com که خوب یک متد داره به نام .parse() و یک آرایه میگیره و تمام فایل های نوشته شده تو آرایه رو برات لود میکنه. هم تو داکیومنت هاش مثال هست. هم یک کلیپ آموزشی روش استفاده از پارسرش رو گذاشته. خلاصه خیلی ردیفه.


2. اگه بخوای تو همون روشی که خودت داشتی پیش میرفتی کار کنی بنظرم این روش جواب میده.

یک تابع مینویسی مثلا loadit و یه تابع onloaditcomplete.
برای سادگی توضیح یک متغیر سراسر از نوع عدد داری به اسم _arrayindex که اولش صفرهک

حالا loadit رو فراخونی میکنی که از آرایه ای که باید لود شوند، شماره ی _arrayindex رو لود کن. و وقتی تموم شد onloadcomplete رو اجرا کن.

تو onloadcomplete :
به _arrayindex یکی اضافه میکنی.
Loadit رو دوباره فراخونی میکنی.
(حواست باشه شرط پایان رو بنویسی که تا عبد اینا همدیگه رو فراخونی نکنند).

همین!
یا حق :)

در مورد مورد دوم منظورتون اینه که ته تابع لود کمپلت تابعی که شامل مقدار دهی لودره فراخوانی کنم دیگه . اینو انجام دادم نشد . این درست مثل همون قفلس که اول نوشتم حالا چه ته تابع لود کمپلت مجوز برای مقدار دهیه مجدد بدیم چه تابعی که همه اینا شاملشونه دوباره فرا بخونیم
--------------------------
چه جالب اصلا مشکل از این حرفا نبود 5-6 ساعت الکی سر کار بودم اون فایل xml که درست کرده بودم که این برنامه باهاش کار می کردو ی برنامه دیگه براش نوشته بودم که اونو بسازه و فایل قسمت های قبلی رو که قبلا بهش داده بودم خودم چند روز پیش پاکشون کرده بودم و فقط فایل آخری مونده بوده !!! :sad: منو شطرنجی کنین:cry:
--------------------------
اما کلا با حلقه نمیشه چون وسط حلقه نمیره ی کاری انجام بده باز برگرده تو حلقه ولی تابعو که قبلا نمیشد مشکلی نداشته
 
آخرین ویرایش:

++Hadi++

Active Member
لودر محلی داخل حلقه for بوجود بیار و اونا رو تو آرایه قرار بده.
مثلا اگه می خوای چنتا عکس رو لود کنی و زیر هم قرار بدی:
یکی از دو تا کار زیر رو بکن:
1- اول همه رو لود کن و تو تابع complete اونا ، یک متغیر int رو یه بار ++ کن . بعد تو همون تابع تست کن که آیا متغیر شمارنده ات بزرگتر مساوی تعداد کل عکس ها یا swf ها شدن یا نه . اگه بله ، با یه وقفه ای ، از اول ، همه لودر ها یا اشیایی که تو آرایه انداختی رو setSize کن . یعنی به نسبت height یا width شون ، مکان دهی کن و برو به خونه بعدی ارایه و به نسبت شمارنده جدیدت ...
2- اولی رو لود کن فقط بعد منتظر باش کلا لود شه ، تو تابع complete یه شمارنده رو ++ کن بعد تست کن که این شمارنده از یه حدی بزرگتر مساوی هست یا نه(تعداد ) اگه نه ، دوباره برو به تابع لودت و لود کن عکس یا ... بعدی رو ، بعد از اتمام تمام اونا یا اتمام تک تک اشیا ، مکان جدید اونو به نسبت اندازه اون و به نسبت مقدار متغیری که اندازه y جدید تو اون قرار میگیره قرار بده.
 

benyamin_pc

Well-Known Member
هادی جان من این تیپی نوشته بودم فقط مشکلش که کار نمیکرد فایلهائی بودن که وجود نداشتن که الان مشکلی نداره
کد:
function ook()
				{
						var con2:URLRequest = new URLRequest(array[iii]);
						ldrcon2.addEventListener(Event.COMPLETE, xld2);
						ldrcon2.load(con2);
					iii++;
				}
				function xld2(event:Event):void
				{
					std = ldrcon2.data;
					if (iii < tule_array)
					{
						ook();
					}
				}
 

جدیدترین ارسال ها

بالا