PDA

View Full Version : سوال: بسیار فوری-سوال در مورد تابع تاخیر



mohammad_kazem
شنبه 26 فروردین 1391, 09:23 صبح
با سلام خدمت دوستان
میخوام برنامم موقع اجرا به اندازه یک ثانیه توقف کنه بعد بره سر خط بعدی. ولی باهر تابعی کار میکنم نمیشه.
توی هر ورژنی از کامپایلر هم یه خطای جدید میده. لطفا راهنمایی کنید
از توابع delay, wait, sleep استفاده کردم ولی جواب نداده
توی Borland Turbo C++ 4.5 برای تابع delay این خطا رو میده
call to undefined function 'delay' in function main()

shahmohammadi
شنبه 26 فروردین 1391, 10:57 صبح
سلام.
با يك حلقه ي تودرتو مي تونيد delay بسازيد:
#include <stdio.h>
#include <conio.h>

int main()
{
unsigned int a,b;
for(a=0;a<65536;a++)
for(b=0;b<5000;b++);
printf("hello");
getch();
}

رامین مرادی
شنبه 26 فروردین 1391, 19:51 عصر
این روش به نظره من خوب نیست می تونید با تابع تایم توی یک حلقه وایل هم زمان رو چک کنی اگه یک ثانیه شد کد هات رو اجرا کنی ولی در کل استفاده از حلقه مقرون به صرفه نیست فکر کنم تابع اسلیپ کار کنه دوباره چک کن

shahmohammadi
شنبه 26 فروردین 1391, 20:21 عصر
این روش به نظره من خوب نیست..........در کل استفاده از حلقه مقرون به صرفه نیست.....

تابع sleep هم با استفاده از همين روش پياده سازي مي شه. كلا هر تاخيري با استفاده از حلقه ايجاد مي شه. حتي برنامه هاي ويندوز هم كه ميبينيد ساكن در يك جا ايستادند و كاري انجام نميدهند هر كدومشون يك حلقه دارند كه مدام در حال اجراست (دور از چشم ما).

استفاده از حلقه خيلي هم رايج هست. مثلا در برنامه هايي كه چند نخ در حال اجراند مي آند براي اينكه يكي از نخ هامنتظر بقيه بمونه، حلقه اي مثل while(a){} مي نويسند كه a مقدارش 1 هست و اين حلقه مدام در حال اجراست. بقيه نخ ها وقتي كه به جايي از الگوريتم مي رسند مي آند a رو 0 مي كنند و اين نخ از حلقه مي آد بيرون. حالا چون اين حلقه دور از چشم ما نيست فكر مي كنيم كه به صرفه نيستند.

موفق باشيد.

one hacker alone
شنبه 26 فروردین 1391, 20:37 عصر
ببينيد منطقي ترين روش كه بيشتر توابع از اونها استفاده ميكنن استفاده از nop (nop مخفف عبارت no operand هست)كد اسمبلي هست كه اين دستور در پردازنده به اندازه 1 سيكل زماني وقت سي پي يو رو ميگيره تنها دستوري كه در اسمبلي براي تاخير وجود داره و شما در شل كد ها هم حتما اون رو ديدين همين دستور هست و ساير توابع از همين استفاده ميكنن شكل استفاده


main()
{
cout<<"salam";
asm
{
NOP
}
cout<<"bye";
}

اما يه نكته شما بايد از اين دستور براي ايجاد وقفه اي به زمان دلخواه استفاده كنيد يعني اينكه يك nop به تنهايي كارتون رو راه نميندازه اين رو ميتونيد به تعداد بيشتر يا استفاده در يك حلقه به يه تابع تبديل كنيد و از اون در برنامه استفاده كنيد.
موفق باشيد

shahmohammadi
شنبه 26 فروردین 1391, 21:08 عصر
به نظر من منطقي نيست.
nop همون دستور XCHG EAX, EAX هست.
با يك دستور نوپ كه نمي شه به اندازه يك ثانيه توقف كرد. اگر هم بخواهيد در داخل حلقه اجراش كنيد كه همون حلقه ي خالي بهتره. در كتاب اسمبلي دكتر سيد رضي هم در قسمت حلقه ها تاخير رو با استفاده از حلقه انجام داده.