PDA

View Full Version : مبتدی: محدودیت زمانی



sara alavi
پنج شنبه 08 بهمن 1388, 17:20 عصر
سلام
من اگه بخوام یه سری دستور در یه مدت زمان محدودی انجام بشه باید چه کار کنیم؟
یعنی این دستورات از زمان آغاز زمان اجرا بشه و به محض اینکه زمان تعیین شده تمام شد، اجرای دستورات متوقف شود.

sara alavi
پنج شنبه 08 بهمن 1388, 22:02 عصر
سلام
من اگه بخوام یه سری دستور در یه مدت زمان محدودی انجام بشه باید چه کار کنیم؟
یعنی این دستورات از زمان آغاز زمان اجرا بشه و به محض اینکه زمان تعیین شده تمام شد، اجرای دستورات متوقف شود.

pswin.pooya
پنج شنبه 08 بهمن 1388, 23:09 عصر
فکر کنم یه سیستم ریل تایم میخوای. این سیستمها بیشتر مبتی بر سخت افزار هستن و سخت افزارهای خاصی رو احتیاج دارن اما با همین PCها هم میشه تقریبا سیستمهای ریل تایم رو تولید کرد که ضریب اطمینان فوقالعاده پایینی رو دارن و برای کارهای حساس مثل کنترل هواپیما و ... نمیشه از اونها استفاده کرد. بطور کل میتونی به صورت زیر حرکت کنی:

توی ویندوز:
یه سیستم مولتی ترد بسازی داخل یه ترد دستورات رو اجرا کنی و با یه ترد دیگه زمان رو کنترل کنی. و اگر ترد زمان متوجه اتمام زمان شد ترد دیگه رو متوقف یا pause کنه.

توی PC:
اینکار بیشتر شبیه به نوشتن یه سیستم عامل میمونه. باید میکرو کنترلر PIT رو برای بازه زمانی که نیاز داری برنامه ریزی کنی. (و البته در کنار اون نیاز به برنامه ریزی میکرو کنترلر pic و کلی مسائل دیگه هم داری). حالا هر وقت به اون بازه زمانی برسی یه وقفه تولید میشه که باعث میشه اجرای دستورات متوقف بشه و وقفه اجرا بشه حالا میتونی توی روتین وقفه هر کار رو که بخوای انجام بدی.

توی سیستمهای دیگه:
توی هر سیستمی (اگر داری طراحی میکنی) باید یک سیستم تولید وقفه خارجی تولید کنی که باعث شه پردازنده و یا میکروکنترلر تولید وقفه کنه و به منوال روش قبل عمل کنی. برای اینکار میتونی از میکرو کنترلر 8253 استفاده کنی (همون روش PC)

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

sara alavi
جمعه 09 بهمن 1388, 10:15 صبح
سلام
من نمی دونم چرا هر سوال میذارم به یه دلیلی حذف میشه توسط مدیران محترم.
سوال من اینه که در برنامه نویسی به زبان c چه جوری میتونیم محدودیت زمانی ایجاد کنیم؟
یعنی مثلا کاربر 30 ثانیه وقت داشته باشه تا اسمشو وارد کنه اگه این 30 ثانیه تموم شد به طور خودکار خط بعدی برنامه اجرا بشه.
آقایان مدیران این سوال ربطی به اینجا نداره؟ اگه نداره لطفا بگید کجا باید مطرح کنم:متفکر:

sara alavi
جمعه 09 بهمن 1388, 11:50 صبح
سلام
میشه لطف کنید جواب سوال رو دوباره بذارید:خجالت:. جواب این سوال خیلی برام مهمه.:افسرده:
ممنون

Salar Ashgi
جمعه 09 بهمن 1388, 15:40 عصر
سلام
من نمی دونم چرا هر سوال میذارم به یه دلیلی حذف میشه توسط مدیران محترم.
سوال من اینه که در برنامه نویسی به زبان c چه جوری میتونیم محدودیت زمانی ایجاد کنیم؟
یعنی مثلا کاربر 30 ثانیه وقت داشته باشه تا اسمشو وارد کنه اگه این 30 ثانیه تموم شد به طور خودکار خط بعدی برنامه اجرا بشه.
آقایان مدیران این سوال ربطی به اینجا نداره؟ اگه نداره لطفا بگید کجا باید مطرح کنم:متفکر:

کاربر گرامی ، مطمئن باشید هیچ پستی بی دلیل و علت حذف نمی شود ، شما اولش یه

چیزی رو گفته بودید که اصلا فاقد مفهوم و معنا بود ، باز الان کمی سوالتون واضحتره ؛ من چند

بار ذکر کردم اینجا برنامه نویسی تحت کنسول C++‎,C هست ، نه هرچیزی رو که به

برنامه نویسی و رایانه ربط بدیم رو ، بیایم اینجا مطرح کنیم ، "خواهشا منطقی فکر کنید "

به صفحه زیر حتما مراجعه کنید :

"لطفا سوالات خود را در بخش مناسب مطرح نمایید " (http://www.barnamenevis.org/forum/showthread.php?t=200066)

=================================

برای ایجاد توقف لحظه ای در برنامه : (کامپایلر Borland)



#include <iostream>
#include <conio>
#include <stdlib>
int main(){
system("pause");
cout<<"Hello\n";
getch();
}
پس اجرای برنامه پیغام press any key to continue مشاهد خواهد شد ، که بعد از کلید اینتر

دستورات برنامه از توقف خارج شده و اجرا میشود .

http://salarcpp.persiangig.com/Image%201/pause.PNG

موفق باشید .

clover
جمعه 09 بهمن 1388, 17:37 عصر
همونطور که دوست عزیز pswin.pooya در تاپیک حذف شده ی شما اشاره کردند، برای این مورد می توانید از ترد (thread) استفاده کنید.
در زیر تاپیک هایی مرتبط با سوال شما و همینطور نحوه ی استفاده از تردها وجود داره:

http://barnamenevis.org/forum/showthread.php?t=169554
http://barnamenevis.org/forum/showthread.php?t=142673
http://barnamenevis.org/forum/showthread.php?p=651288
البته با جستجو می توانید مثال های بیشتری پیدا کنید.
موفق باشید.

sara alavi
جمعه 09 بهمن 1388, 18:22 عصر
همونطور که دوست عزیز pswin.pooya در تاپیک حذف شده ی شما اشاره کردند، برای این مورد می توانید از ترد (thread) استفاده کنید.
در زیر تاپیک هایی مرتبط با سوال شما و همینطور نحوه ی استفاده از تردها وجود داره:

http://barnamenevis.org/forum/showthread.php?t=169554
http://barnamenevis.org/forum/showthread.php?t=142673
http://barnamenevis.org/forum/showthread.php?p=651288
البته با جستجو می توانید مثال های بیشتری پیدا کنید.
موفق باشید.


راستش من تا حالا چیزی از thread نشنیده بودم یه کم فهمش برام سخته!:افسرده:
فکر کنم کد زیر که در تاپیک
http://barnamenevis.org/forum/showthread.php?t=169554


class TMyThread : public TThread
{
protected:
void __fastcall Execute();
public:
__fastcall TMyThread(bool CreateSuspended);
};
//---------------------------------------------------------------------------
__fastcall TMyThread::TMyThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
// ذخیره زمان جاری
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::Execute()
{
// کد مورد نظر شما
}
//---------------------------------------------------------------------------
void __fastcall ThreadDone(TObject * /*Sender*/)
{
// مقایسه دو زمان جاری فعلی با زمان ذخیره شده قبلی
}
//---------------------------------------------------------------------------
TMyThread *k;
k = new TMyThread(false); // if it is true thread Suspended.
k->FreeOnTerminate = true;
k->OnTerminate = ThreadDone;

مطرح شده بود تقریبا چیزیه که من میخوام ولی میشه یکی برام توضیحش بده؟ من اصلا نمی فهمم این چیه؟!:عصبانی++:

pswin.pooya
جمعه 09 بهمن 1388, 18:56 عصر
راستش من تا حالا چیزی از thread نشنیده بودم یه کم فهمش برام سخته!

ترد یا نخ قسمت هایی از برنامه هستن که هم زمان اجرا میشن مثل چند تا برنامه باز داخل ویندوز که هم زمان اجرا میشن. برای کار با تردها داخل C++ راهای خیلی زیادی وجود داره به عنوان مثال:

1. استفاده از توابع API ویندوز (از همه بهتره - به خاطر کنترل بالا و در عین حال هم سختره)
2. استفاده از کلاسهای و یا تواع فریم ورکهای مختلف (فکر کنم mfc برای کار با تردها کلاس داره)
3. استفاده از کتابخونه های کراس پلتفرم مثل SDL که هم آسون هستن و هم سازگاری بالا دارن.
4. پیاده سازی مستقیم (اصلا دنبالش نرو - بیخیال - نشنیده بگیر)

من خودم برای یه مبتدی SDL رو ترجیح میدم ولی اگر میخوای اصولی کار کنی برو سراغ API سیستم عامل.

برای کار با تردها باید موارد خیلی زیادی رو رعایت کنی (مثل هم زمانی) و یا کار با دستگاهای جانبی. تردها مثل یه دستگاه تولید باگ میمونن رعایت نکردن کوچکترین چیزی باعث به وجود اومدن باگهایی میشه که پیدا کردنشون ساعتها طول میکشه.

sara alavi
جمعه 09 بهمن 1388, 19:42 عصر
من تو c میخوام کار کنم نه C++‎ !


یه سوال!
این امکان وجود داره که


1- int time = Get time from system (second)



2- int a=time;



3- do{



…………………



…………………



…………………



}while( time<5+a)



نمیدونم منظورمو درست بیان کردم یا نه.....



منظورم اینه که زمان کامپیوتر رو بگیره و تا مثلا 5 ثانیه بعد دستوراتی رو انجام بده. تابعی وجود داره که زمان جاری رو بگیره و در طول برنامه اونو دائم چک کنه؟

sara alavi
جمعه 09 بهمن 1388, 19:48 عصر
ترد یا نخ قسمت هایی از برنامه هستن که هم زمان اجرا میشن مثل چند تا برنامه باز داخل ویندوز که هم زمان اجرا میشن. برای کار با تردها داخل C++‎‎ راهای خیلی زیادی وجود داره به عنوان مثال:

1. استفاده از توابع API ویندوز (از همه بهتره - به خاطر کنترل بالا و در عین حال هم سختره)
2. استفاده از کلاسهای و یا تواع فریم ورکهای مختلف (فکر کنم mfc برای کار با تردها کلاس داره)
3. استفاده از کتابخونه های کراس پلتفرم مثل SDL که هم آسون هستن و هم سازگاری بالا دارن.
4. پیاده سازی مستقیم (اصلا دنبالش نرو - بیخیال - نشنیده بگیر)

من خودم برای یه مبتدی SDL رو ترجیح میدم ولی اگر میخوای اصولی کار کنی برو سراغ API سیستم عامل.

برای کار با تردها باید موارد خیلی زیادی رو رعایت کنی (مثل هم زمانی) و یا کار با دستگاهای جانبی. تردها مثل یه دستگاه تولید باگ میمونن رعایت نکردن کوچکترین چیزی باعث به وجود اومدن باگهایی میشه که پیدا کردنشون ساعتها طول میکشه.



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

tdkhakpur
جمعه 09 بهمن 1388, 19:52 عصر
مطمئننا اینگونه کاری که شما میخواهید انجام بدید برای اجرای همزمان دو برنامه یا به اصطلاح دو قطعه کد متفاوت هست ولی به روش فوق شما نمیتوانید این کار را انجام بدید مگر اینکه به pop و push کردن موقعیت جاری برنامه فعلی و اجرای کدهای برنامه دیگر اطلاع کامل داشته باشید .
به هر صورت اگر منظورتان ایجاد ترد و نخهاست شما میتوانید از کلاس Task استفاده کنید توضیحات کامل داخل turbo c نوشته استیفان آر.دیویس ترجمه مهندس کیوان فلاح مشفقی استفاده کنید.
و یا اگر کار ساده با تایمر دارید میتوانید داخل یک حلقه تایمر سیستم را دریافت کرده و هر کدی را که خواستید با یک شرط زمان را بررسی و کار مورد نظر را صدا کنید

sara alavi
جمعه 09 بهمن 1388, 20:36 عصر
و یا اگر کار ساده با تایمر دارید میتوانید داخل یک حلقه تایمر سیستم را دریافت کرده و هر کدی را که خواستید با یک شرط زمان را بررسی و کار مورد نظر را صدا کنید

میشه توضیح بدید چه جوری این کار رو انجام بدم؟
تایمر سیستم رو چه جوری دریافت کنم؟؟ این تایمر زمان رو بر چه اساسی میده؟(ثانیه؟)

clover
جمعه 09 بهمن 1388, 23:34 عصر
و یا اگر کار ساده با تایمر دارید میتوانید داخل یک حلقه تایمر سیستم را دریافت کرده و هر کدی را که خواستید با یک شرط زمان را بررسی و کار مورد نظر را صدا کنید

میشه توضیح بدید چه جوری این کار رو انجام بدم؟
تایمر سیستم رو چه جوری دریافت کنم؟؟ این تایمر زمان رو بر چه اساسی میده؟(ثانیه؟)
برای گرفتن زمان می تونید از تابع time استفاده کنید. این تابع زمان را به صورت ثانیه هایی که از نیمه شب گذشته محاسبه می کند.
تابع time نیاز به یک پارامتر دارد که از نوع اشاره گر به time_t هست تا زمان را در اون ذخیره کنه.

شما می تونید زمان را در لحظه ای که کاربر شروع به ورود رشته می کند (دقیقا قبل از دستور ;(cscanf("%s",s) در یک متغیر ذخیره کنید. و زمان را در لحظه ای که کاربر کار ورود رشته را تمام کرد (دقیقا بعد از دستور ;(cscanf("%s",s) در یک متغیر دیگر. بعد اختلاف این دو زمان را در جایی که لازم است محاسبه کنید.
با این روش به کاربر برای وارد کردن رشته به طور نامحدود، زمان داده میشه اما فقط در صورتی که در 10 ثانیه اول رشته را وارد کرده باشه قابل قبول هست.
این یک نمونه کد از روش فوق هست:

#include<conio.h>
#include<stdio.h>
#include <time.h>

int main()
{
char ch;
time_t beginTime, endTime;

printf("enter a charracter within 10 second:");
time(&beginTime);

scanf("%c", &ch);
time(&endTime);

if ((int)(endTime - beginTime) <= 10)
printf("win");
else
printf("lose");

getch();
return 0;
}

tdkhakpur
شنبه 10 بهمن 1388, 13:20 عصر
توابعی مانند scanf و سایر توابع ورودی برای خالی شدن بافر صفحه کلید منتظر میمانند لذا شما برای اینکه از فشار دادن صفحه کلید داخل کد برنامه تان اطلاع پیدا کنید باید از تابع kbhit استفاده کنید کد زیر را میتوانید به جای cscanf استفاده کنید


// str رسته مورد نظر
// len طول رشته
// second زمان مورد انتظار به ثانیه
void GetStr(char *str, int len, int second )
{
struct time t1, t2;
gettime(&t1);
t2 = t1;
second += (t1.ti_min*60+t1.ti_sec);
for( int i=0; i<len && (t2.ti_min*60+t2.ti_sec)<=second; ){
if( kbhit() ){
str[i] = getch(); // اگر میخواهید ویرایشگر کامل داشته باید اینجا را اصلاح کنید
printf("%c", str[i]); // منظور یرایش متن مانند حذف کردن و تغییر
i++;
}
gettime(&t2);
}
}

amin1softco
شنبه 10 بهمن 1388, 15:16 عصر
آقا اینم یکمی مختصر تره ولی از اصلش همون kbhit



#include <conio.h>
typedef unsigned short word;
word *my_clock=(word *)0x0000046C; /* this points to the 18.2hz system */
char* wait(int ticks)
{
word start;
char* str="";
int i=0;
start=*my_clock;
while (*my_clock-start<ticks){
*my_clock=*my_clock;
if(kbhit()) str[i++]=getche();
}
str[i]=0;
return str;
}
void main(){
char* str;
clrscr();
cprintf("plz write any thing to win in 1 sec:");
str=wait(100);
if(str[0]==0){
cprintf("\n you lost ");
}else{
cprintf("\n you win ,str = %s",str);
}
getch();
}

sara alavi
شنبه 10 بهمن 1388, 18:21 عصر
از همه ی دوستان ممنون
من جوابمو گرفتم