جابه جايي خط ‏

Amit13

Well-Known Member
سلام دوستان
يك مشكل الگريتمي پيدا كردم,هرچقدر فكر ميكنم,چيزي به ذهنم نميرسه.
من ميخوام يك لاين عمود كه عرض يك پيكسل رو داره,روي محور ايكس ها جابه جا كنم.به طوري كه موقعيت هر لحظه ي ايكس لاين براي من مهمه.
مصلما از دستور
MoveTo
نميتونم استفاده كنم,من كد رو اينجوري نوشتم:

کد:
For xline=20 to 200
MoveObject("line","xline,2")
Pause("1")
Next xline

اما مشكلي كه اين دستور داره,سرعت است كه خيلي سرعت اتمام حلقه پايينه;خوب به خاطر
Pause
كه گذاشتم هست.ولي اين دستور رو نذارم,سرعت بينهايت بالا ميره.
لطفا يك روش پيشنهاد كنيد كه بتونم سرعت رو درست كنم.
مرسي.
 
آخرین ویرایش:

the_king

مدیرکل انجمن
خیلی ساده است، با یه کم کد نویسی مشکل حل میشه.
اول باید سرعت سیستم کاربر رو عملا اندازه بگیریم تا مشخص بشه که فرضا یک حلقه For که از اعداد 1 الی 1000
رو طی می کنه در عرض چند ثانیه اجراش تموم میشه. بعد با کمک نتیجه این محاسبه، بازه حلقه For رو طوری
مشخص می کنیم که بین هر بار حرکت دادن خط اونقدر مکث ایجاد بشه که مورد نظر ما است.
طبیعتا نمی توانیم مقدار بازه را با اعداد ثابت مثل 1000 یا 5000 مشخص کنیم، چون روی هر کامپیوتری سرعت
متفاوتی خواهد داشت، پس باید در ابتدای برنامه سرعت کامپیوتر رو اندازه بگیریم و سپس به عنوان یک فاکتور
در بازه حلقه ازش استفاده کنیم.

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

پیوست ها

  • speed.zip
    959 بایت · بازدیدها: 18

Amit13

Well-Known Member
مرسي the_king جان.
خيلي مثاله باحالي بود.:rose:
ولي ميشه يكم راجع به اين دستورات كه داخل اسكريپ GetSystemSpeedFactorبيشتر توضيح بديد؟؟؟

کد:
stop = 0
Refresh("")
ScriptTimer("SetStopValue","200")
speedfactor = 0
For wait = 1 To Infinity
  If (stop <> 0) Then
    Break()
  End
  Refresh("")
  speedfactor = speedfactor + 1
Next wait
speedfactor = speedfactor * 5
 

the_king

مدیرکل انجمن
مرسي the_king جان.
خيلي مثاله باحالي بود.:rose:
ولي ميشه يكم راجع به اين دستورات كه داخل اسكريپ GetSystemSpeedFactorبيشتر توضيح بديد؟؟؟
خواهش می کنم، ما بایستی برای ایجاد کردن یک وقفه زمانی کوتاه، یک حلقه For بسازیم که تا یک عدد مشخصی رو
بشماره تا وقت تلف بشه، اما اول باید با سنجیدن سرعت کامپیوتر، مقدار اون عدد مشخص رو تعیین کنیم.
چون از ابتدا از سرعت کامپیوتر اطلاعی نداریم، مقدار نهایی حلقه رو Infinity در نظر می گیریم یعنی حلقه بی انتها.
بعد زمانی که از اجرای این حلقه 200 میلی ثانیه (1/5 ثانیه) گذشت، متوقف اش می کنیم. از روی مقداری که حلقه
در عرض اون 200ms طی کرده میشه تشخیص داد که کامپیوتر در هر ثانیه (یا هر واحد زمانی دیگه) چند عدد رو پیمایش می کنه.
اینطوری می توانیم با دقت نسبتا خوبی مشخص کنیم که فرضا اگه بخواهیم 50 میلی ثانیه وقفه ایجاد کنیم، چه مقداری رو
برای انتهای حلقه در نظر بگیریم.

اگه ما مزاحم اجرا شدن این حلقه Infinity نشیم، حلقه متوقف نمیشه، پس یک متغیر به اسم stop را در نظر گرفتم
که اگه مقدارش مخالف 0 بود، حلقه اجراش متوقف بشه :
کد:
[B]stop[/B] = 0
.
.
.
  If ([B]stop[/B] <> 0) Then
    Break()
  End

ما باید حلقه رو بعد از 200 میلی ثانیه متوقف کنیم، اما چون بصورت مستقیم به تایمر دقیق کامپیوتر دسترسی نداریم، از دستور
ScriptTimer استفاده می کنیم که برای اجرا کردن یک Script تایمر داره. کافیه که در داخل اون Script مقدار stop رو به یک عدد غیر از
صفر تغییر بدیم تا حلقه ما متوقف بشه. قبل از همه یک دستور Refresh رو هم می نویسیم که اگه عملیات نیمه تمومی از قبل
مونده باشه، MMB پیش از راه انداختن اون تایمر انجام بده.
کد:
Refresh("")
ScriptTimer("SetStopValue","200")

speedfactor متغیری است که توی حلقه مقدارش زیاد میشه، هر زمانی که حلقه متوقف شد، speedfactor مشخص می کنه
که کامپیوتر در عرض 200 میلی ثانیه چند عدد رو توی حلقه می شماره :
کد:
[B]speedfactor[/B] = 0
For wait = 1 To Infinity
  Refresh("")
  [B]speedfactor[/B] = [B]speedfactor[/B] + 1
Next wait

واحد count per 200ms واحد بدی نیست، اما ما مقدار speedfactor رو در 5 ضرب می کنیم تا به count per 1s (شمارش در ثانیه) تبدیل بشه :
کد:
[B]speedfactor[/B] = [B]speedfactor[/B] * 5

پس الان حدودا مشخص شده که در یک حلقه که داخلش یک دستور Refresh باشه و تا speedfactor رو بشماره، حدود 1 ثانیه وقت تلف می کنه.
 

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

بالا