ایجاد وقفه در اجرای یک حلقه

rashooda

New Member
دوستان سلام

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

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f

rashooda

New Member
آقااااااااا

من سرعت نتم افتضاحه
با اینحال ی بار هم دانلودش کردم اما فایل rar باز نشد :(
چون گوگل درایو هست، با دانلود منیجر هم نمیشه دان کرد
لطفا اگه براتون مقدوره کدشو همینجا بنویسید تا بردارم :rose:
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
بهتر بود با مرورگر opera دانلود میکردین
چرا باز نشد؟ ارورش چی بود؟ یا مشکل دیگه ای داشت؟
این هم بگم که چون بصورت rar 5 فشرده شده ، موقع باز یا اکسترکت کردن ، نسخه ی rar باید شماره ی 5 باشه (نسخه شماره 4 نمیشه)
آموزش متنی شم جداگانه هست (لینکش رو دادم)
 

rashooda

New Member
بهتر بود با مرورگر opera دانلود میکردین
چرا باز نشد؟ ارورش چی بود؟ یا مشکل دیگه ای داشت؟
این هم بگم که چون بصورت rar 5 فشرده شده ، موقع باز یا اکسترکت کردن ، نسخه ی rar باید شماره ی 5 باشه (نسخه شماره 4 نمیشه)
آموزش متنی شم جداگانه هست (لینکش رو دادم)
اوه بله ورژن winrar من 4 بود
خدا خیرت بده
 

rashooda

New Member
بهتر بود با مرورگر opera دانلود میکردین
چرا باز نشد؟ ارورش چی بود؟ یا مشکل دیگه ای داشت؟
این هم بگم که چون بصورت rar 5 فشرده شده ، موقع باز یا اکسترکت کردن ، نسخه ی rar باید شماره ی 5 باشه (نسخه شماره 4 نمیشه)
آموزش متنی شم جداگانه هست (لینکش رو دادم)
ضمن احترام برای زحمتی که بابت تهیه کردن آموزش ها کشیدید، پیشنهاد می کنم دیگه حتی طرف آموزش هم نرید!
چون فاجعه توضیح میدید.
فک کنم این نظر تمام کسانی باشه که آموزش ها رو دانلود کردن ودیدن
بسیار بسیار مبهم، گنگ و بد توضیح میدین
واقعا دعا می کنم تو سیستم آموزشی نباشین چون با این وضع درس دادنتون دانش آموزاتون بیچاره ان
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ضمن احترام برای زحمتی که بابت تهیه کردن آموزش ها کشیدید، پیشنهاد می کنم دیگه حتی طرف آموزش هم نرید!
چون فاجعه توضیح میدید.
فک کنم این نظر تمام کسانی باشه که آموزش ها رو دانلود کردن ودیدن
بسیار بسیار مبهم، گنگ و بد توضیح میدین
واقعا دعا می کنم تو سیستم آموزشی نباشین چون با این وضع درس دادنتون دانش آموزاتون بیچاره ان

ممنون از انتقادتون
حالا کدوم قسمت رو متوجه نشدین؟
اگه نقطه ی مبهم و توضیح نداده ای هست و اشکال دارین ، بگین ، بتونم ، برای رفع مشکل توضیح بدم
 

rashooda

New Member
ممنون از انتقادتون
حالا کدوم قسمت رو متوجه نشدین؟
اگه نقطه ی مبهم و توضیح نداده ای هست و اشکال دارین ، بگین ، بتونم ، برای رفع مشکل توضیح بدم
والا بخدا هیچیشو متوجه نشدم :)
سوال من بسیار بسیار ساده اس، نه مث آموزش شما هزار تا آرگومان و آرایه لازم داره، نه لازم دارم که مثلا سه چهار بار در اجرای چند خط دستور وقفه داشته باشم

من میخوام در اجرای یک حلقه بسیار ساده، مثلا برای هر بار اجرای حلقه، برنامه 100 میلی ثانیه وقفه داشته باشه، همین
مثال
i = 1;
while (i < 10) do
i = i + 1;
-- وقفه ي 100 ميلي ثانيه اي
end
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
والا بخدا هیچیشو متوجه نشدم :)
سوال من بسیار بسیار ساده اس، نه مث آموزش شما هزار تا آرگومان و آرایه لازم داره، نه لازم دارم که مثلا سه چهار بار در اجرای چند خط دستور وقفه داشته باشم

من میخوام در اجرای یک حلقه بسیار ساده، مثلا برای هر بار اجرای حلقه، برنامه 100 میلی ثانیه وقفه داشته باشه، همین
مثال
i = 1;
while (i < 10) do
i = i + 1;
-- وقفه ي 100 ميلي ثانيه اي
end

اگه کم درد سر ترین راه حل رو میخواین ، بجای اون خطی که وقفه نوشتین ، تابع Application.Sleep رو بنویسین ولی این اصولی نیست چون باعث مشکلاتی از قبیل قفل شدن در زمان اجرای این تابع میشه و ... اما کم دردسر هه
ولی اصولیش همونطور که گفتم استفاده از کروتین هاست .
این رو در Global Function بزارید :


کد:
function MyFunc()
    i = 1;
    while (i < 10) do
    i = i + 1;
    coroutine.yield();
    end
end

و این رو در رویدادی که میخواین کدتون اجرا بشه در زمان مشخص (در زیر هر 2 ثانیه در میون هه) :


کد:
MyCoroutine = coroutine.create(MyFunc);
Page.StartTimer(2000, 1);

و این رو هم در تایمر :

کد:
if (e_ID==1) then
myState = coroutine.resume(MyCoroutine);
    if (myState==false) then
    Page.StopTimer(1);
    end
end

دقت کنید نباید در تابع بالا یعنی تابع MyFunc که بدنه ی اصلی کد مورد نظرتون توش نوشته میشه ، از توابعی استفاده بشه که بخودی خود باعث مکث و توقف کد میشن مثل Dialog.Message یا Application.Sleep و ... . اگه میخواین از این توابع ها استفاده کنین ، در تایمر ، قبل از تابع coroutine.resume باید تابع Page.StopTimer و در Global Function ، قبل از تابع coroutine.yield باید تابع Page.StartTimer رو فراخونی کنین تا موقع اجرای بدنه ی تابع MyFunc ، تایمر دوباره اجرا نشه
اگه هم نیاز به مقدار بازگشتی در هر بار توقف در تابع MyFunc دارین (برای دسترسی این مقدار در تایمر) ، از آرگومان تابع coroutine.yield و همینطور خروجی تابع coroutine.resume استفاده کنین که بحث طولانی ای داره و در آموزش گفته شد


دوست عزیز ، من نمیدونم شما تا کجا به لوا مسلط این . شاید به مباحث قبلی تسلط نداشتین که درکش براتون سخت بود . ضمن اینکه نمیشد مثالی کوچیکتر و کمتر از مثال اولی ای که توی آموزش زده شد ، زده میشد چون درک کلی شو نمیشد رسوند . کوروتین ها ، چون آرگومان یه تابع (yield) به خروجی تابع دیگه (resume) مربوط میشه ، درکش یه کم در وهله ی اول پیچیده به نظر میرسه . حالا چند تا تابع آورده بشه ، یه کم پیچیده تر میشه اما یه کم دقت بیشتری انجام بشه ، مبحث سختی نیست و آسونه
مثال آرایه زدن که مشکل ای نباید داشته باشه (از لحاظ درک راحت تر)
 

rashooda

New Member
اگه کم درد سر ترین راه حل رو میخواین ، بجای اون خطی که وقفه نوشتین ، تابع Application.Sleep رو بنویسین ولی این اصولی نیست چون باعث مشکلاتی از قبیل قفل شدن در زمان اجرای این تابع میشه و ... اما کم دردسر هه
ولی اصولیش همونطور که گفتم استفاده از کروتین هاست .
این رو در Global Function بزارید :


کد:
function MyFunc()
    i = 1;
    while (i < 10) do
    i = i + 1;
    coroutine.yield();
    end
end

و این رو در رویدادی که میخواین کدتون اجرا بشه در زمان مشخص (در زیر هر 2 ثانیه در میون هه) :


کد:
MyCoroutine = coroutine.create(MyFunc);
Page.StartTimer(2000, 1);

و این رو هم در تایمر :

کد:
if (e_ID==1) then
myState = coroutine.resume(MyCoroutine);
    if (myState==false) then
    Page.StopTimer(1);
    end
end

دقت کنید نباید در تابع بالا یعنی تابع MyFunc که بدنه ی اصلی کد مورد نظرتون توش نوشته میشه ، از توابعی استفاده بشه که بخودی خود باعث مکث و توقف کد میشن مثل Dialog.Message یا Application.Sleep و ... . اگه میخواین از این توابع ها استفاده کنین ، در تایمر ، قبل از تابع coroutine.resume باید تابع Page.StopTimer و در Global Function ، قبل از تابع coroutine.yield باید تابع Page.StartTimer رو فراخونی کنین تا موقع اجرای بدنه ی تابع MyFunc ، تایمر دوباره اجرا نشه
اگه هم نیاز به مقدار بازگشتی در هر بار توقف در تابع MyFunc دارین (برای دسترسی این مقدار در تایمر) ، از آرگومان تابع coroutine.yield و همینطور خروجی تابع coroutine.resume استفاده کنین که بحث طولانی ای داره و در آموزش گفته شد


دوست عزیز ، من نمیدونم شما تا کجا به لوا مسلط این . شاید به مباحث قبلی تسلط نداشتین که درکش براتون سخت بود . ضمن اینکه نمیشد مثالی کوچیکتر و کمتر از مثال اولی ای که توی آموزش زده شد ، زده میشد چون درک کلی شو نمیشد رسوند . کوروتین ها ، چون آرگومان یه تابع (yield) به خروجی تابع دیگه (resume) مربوط میشه ، درکش یه کم در وهله ی اول پیچیده به نظر میرسه . حالا چند تا تابع آورده بشه ، یه کم پیچیده تر میشه اما یه کم دقت بیشتری انجام بشه ، مبحث سختی نیست و آسونه
مثال آرایه زدن که مشکل ای نباید داشته باشه (از لحاظ درک راحت تر)



یه جورایی روند پیچیده و مسخره ای ب نظر میاد!
من از mmb کوچ کرده ام به ams فقط ب خاطر اینکه می دونستم mmb دیگه بروز نمیشه و امکانات ams بیشتره. اما الان دارم می بینم نوشتن ی وقفه ک توی مالتی مدیا بیلدر ب آسونی آب خوردن بود اینجا چندین خط کدنویسی، اونم تو قسمت های مختلف داره.

با اینحال تقریبا فهمیدم چی ب چیه، الا یک مورد!
این شرط دقیقا چیکار میکنه؟

کد:
if (myState==false) then
    Page.StopTimer(1);
    end
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
یه جورایی روند پیچیده و مسخره ای ب نظر میاد!
من از mmb کوچ کرده ام به ams فقط ب خاطر اینکه می دونستم mmb دیگه بروز نمیشه و امکانات ams بیشتره. اما الان دارم می بینم نوشتن ی وقفه ک توی مالتی مدیا بیلدر ب آسونی آب خوردن بود اینجا چندین خط کدنویسی، اونم تو قسمت های مختلف داره.

با اینحال تقریبا فهمیدم چی ب چیه، الا یک مورد!
این شرط دقیقا چیکار میکنه؟

کد:
if (myState==false) then
    Page.StopTimer(1);
    end

دوست عزیز ، من با MMB کار نکردم ولی تا جایی که اطلاع دارم MMB زبان اسکریپتی ای که یه شرکت تولید کنه نیست . صرفا فقط کدنویسی ای هست که شرکت اش زده در حالی که اتوپلی از زبان لوا استفاده میکنه و این یعنی MMB خیلی از قابلیت های زبان لوا مثل همین کوروتین و پترن ها و file i/o واستفاده از ماژول ها و بسیاری از موارد دیگه رو به احتمال زیاد نباید داشته باشه (بازم نمیدونم)
شاید MMB قابلیت مکث داشته باشه اما در قالب توابع آماده احتمالا باید باشه که همونطور که گفتم ، تابع آماده ی این کار در اتوپلی Application.Sleep هست (فقط همین تابع رو فراخونی کنین ، کد متوقف میشه) اما مشکلاتی از جمله not responding برنامه تا پایان اجرای این تابع و همینطور افزایش مصرف پردازنده داره (ولی کوروتین این مشکلات رو نداره) .
اتوپلی هم چندان آپدیت خاصی نمیشه . فقط هر چند سال درمیون یه آپدیت کوچیکی میشه که ویندوزهای جدید و احیانا باگ های کوچیک شو رفع کنه . وگرنه اینکه آپدیتی بشه که قابلیت خاصی بهش اضافه بشه ، حداقل از سال 2012 تا حالا نشد و این جور که معلومه شاید نشه
اگه واقعا برنامه نویسی رو پیگیری میکنین ، و اگه به MMB مسلط هستین ، به نظرم کوچ کردن به اتوپلی خیلی دست تون رو باز نمیکنه . اتوپلی خودش ضعف های زیادی هم داره . به نظرم اگه به MMB مسلط هستین ، سمت سی شارپ برین

متغییر myState وضعیت اتمام کوروتین (وضعیت اتمام تابع MyFunc) رو برمیگردونه . اگه کوروتین تمام نشده باشه true و اگه تمام شده باشه ، false رو برمیگردونه . توی شرط هم گفته شد اگه اجرای کوروتین تمام شد ، دیگه تایمر رو اجرا نکن
 

rashooda

New Member
دوست عزیز ، من با MMB کار نکردم ولی تا جایی که اطلاع دارم MMB زبان اسکریپتی ای که یه شرکت تولید کنه نیست . صرفا فقط کدنویسی ای هست که شرکت اش زده در حالی که اتوپلی از زبان لوا استفاده میکنه و این یعنی MMB خیلی از قابلیت های زبان لوا مثل همین کوروتین و پترن ها و file i/o واستفاده از ماژول ها و بسیاری از موارد دیگه رو به احتمال زیاد نباید داشته باشه (بازم نمیدونم)
شاید MMB قابلیت مکث داشته باشه اما در قالب توابع آماده احتمالا باید باشه که همونطور که گفتم ، تابع آماده ی این کار در اتوپلی Application.Sleep هست (فقط همین تابع رو فراخونی کنین ، کد متوقف میشه) اما مشکلاتی از جمله not responding برنامه تا پایان اجرای این تابع و همینطور افزایش مصرف پردازنده داره (ولی کوروتین این مشکلات رو نداره) .
اتوپلی هم چندان آپدیت خاصی نمیشه . فقط هر چند سال درمیون یه آپدیت کوچیکی میشه که ویندوزهای جدید و احیانا باگ های کوچیک شو رفع کنه . وگرنه اینکه آپدیتی بشه که قابلیت خاصی بهش اضافه بشه ، حداقل از سال 2012 تا حالا نشد و این جور که معلومه شاید نشه
اگه واقعا برنامه نویسی رو پیگیری میکنین ، و اگه به MMB مسلط هستین ، به نظرم کوچ کردن به اتوپلی خیلی دست تون رو باز نمیکنه . اتوپلی خودش ضعف های زیادی هم داره . به نظرم اگه به MMB مسلط هستین ، سمت سی شارپ برین

متغییر myState وضعیت اتمام کوروتین (وضعیت اتمام تابع MyFunc) رو برمیگردونه . اگه کوروتین تمام نشده باشه true و اگه تمام شده باشه ، false رو برمیگردونه . توی شرط هم گفته شد اگه اجرای کوروتین تمام شد ، دیگه تایمر رو اجرا نکن


ممنون بابت وقتی که میذارید و با حوصله توضیح میدید.
الان یه سوال دیگه دارم که ربطی به مشکل اولم نداره.
سوالم اینه که چطور می تونم یه متغیر رو داخل یه تابع مقداردهی کنم به شکلی که خارج از تابع هم قابل دسترسی باشه؟
به بیان دیگه چجوری میشه داخل یه متغیر تابع گلوبال تعریف کرد؟
تو نت که سرچ زدم نوشته بود قبل از اسم متغیر
کد:
 _G.
رو قرار بدید، اما امتحان کردم جواب نداد
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
توی لوا بصورت پیش فرض متغییر تعریف شده ، سراسری هست (مثل سی شارپ و .. نیست)
لازم به کار اضافی ای نیست
 

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

بالا