PDA

View Full Version : سوال: چند سوال پیرامون یک پروژه



SamaPic
پنج شنبه 28 خرداد 1388, 19:56 عصر
با سلام خدمت دوستان عزیز
من قصد دارم در پروژه ی پایان ترمم چند مورد که تا کنون در جایی ندیدم را اضافه کنم.
پیرو ی این موارد چند سوال دارم:
1.آیا می شود آهنگ ( صدا ) از خارج از برنامه ی توربو به برنامه فراخوانی کرد؟
(اگر امکان چنین کاری می باشد ، نوع فایل ها ی فراخوان شونده و چگونگی آن چیست؟)
2.آیا تابعی برای تعیین میزان پیشرفت کار وجود دارد؟
( به عنوان مثال، توابعی که بتواند تشخیص دهد چند درصد کار های یک تابع ( شرط ها ، حلقه ها و ... ) به نسبت کل تابع انجام شده است.)
3.آیا تابعی که زمان اجرا را تخمین بزند وجود دارد؟
(به عنوان مثال بیان کند برای کپی شدن یک فایل از جایی در جای دیگر چه میزان زمان مانده.یک نمونه:" تخمین زمان کپی در هنگام کپی شدن اطلاعات یک فایل ")

با تشکر فراوان .
خدانگهدار.

tdkhakpur
جمعه 29 خرداد 1388, 01:08 صبح
سلام
برای پخش صدا از فایلهای اجرایی کمکی مثل playwave در دستور system برای اجرا استفاده کنید.
ولی در مورد زمان اجر شما میتوانید از ساعت سیستم بطوریکه قبل از اجرای دستور یا دستورات خاص زمان را ثبت و در هنگام خاتمه با زمان جدید مقایسه کنید.
در مورد فایل هم باید ظرفیت فایل را گرفته به هنگام خواندن هر تعداد از بایتهای فایل پیشرفت پردازش را نمایش دهید.که برابر فرمول زیر هست



کل حجم فایل/تعداد بایتهای خوانده شده

SamaPic
جمعه 29 خرداد 1388, 16:07 عصر
با تشکر.
دوست من من منظور من از زمان اجرا این است که خود برنامه را یکبار بطور کامل اجرا کن و سپس تشخیص دهد که چه میزان کار انجام شده.
یک چیزی مانند لود .
بگذارید بهتر توضیح دهم.
من قصد دارم بازی شطرنج را بنویسم.در مورد نوشتن بازی هیچ مشکلی ندارم و در انتهای کار هستم.
ولی می خواهم در هنگام کیش یا مات شدن با صدایی اعلام کند که شما کیش شدید یا .... .
من می خواهم برنامه که قصد انجام حرکت را دارد ، به طرف مقابل ( کاربر ) نشان دهد که چند دقیقه ی دیگر حرکتی از جانب کامپیوتر انجام می شود.به عنوان مثال بنویسد که 10 درصد کار برنامه مانده است.و بیان کند مثلا چقدر زمان طول می کشد ( مثلا 1 دقیقه ی دیگر ) تا کار کامپیوتر تمام شود.
از طرفی به دلیل اینکه حرکت مهره ها ثبت می شود ، می خواهم تمامی موارد (که البته حجم بسیار کمی دارند ) را بتواند ذخیره کند.در ذخیره کردن مشکلی ندارم ولی می خواهم مثلا بنویسد که چند درصد از جحم ذخیره شد و تا پایان عملیات ذخیره سازی چقدر زمان مانده است.

با تشکر.

tdkhakpur
جمعه 29 خرداد 1388, 18:56 عصر
سلام
شما برای اینکار نباید cpu را مجبور کنید بلکه این محاسبات هست که زمان را مشخص میکند.
ولی از ساعت سیستم کمک بگیرید تا وقت صرف شده توسط طرفیت را اعلام کند.

SamaPic
جمعه 29 خرداد 1388, 19:30 عصر
با تشکر مجدد از شما.
ولی دوست من ، من می خواهم تابع یا بهتر بگویم توابع قبل از شروع بازی یک بار اجرا شود.مانند حالت رندل کردن.که یک بار کل برنامه را اجرا کند .من خودم می دانم ابتدا و انتهای برنامه زمان را از سیستم بگیرم و از هم کم کنم.ولی این آن چیزی نیست که من به دنبال آن می گردم.من می خواهم قبل از شروع برنامه ،برنامه (بازی) یک بار اجرا شود(بدون نمایش چیزی در صفحه و زدن دکمه از سوی من) و سپس به من زمان را به بگوید تا پس از زدن دکمه ی شروع یکبار همین کار را انجام دهد و سپس ثانیه معکوس انجام دهد.

tdkhakpur
جمعه 29 خرداد 1388, 23:29 عصر
سلام
خوب من متوجه نشدم شما میخوایید طرفین با هم بازی کنند یا میخوایید از بازی save بگیرید بعد به اجراش نگاه کنید.
ببینید در حالت کلی شما نمیتوانید زمان اجرای کد رو مشخص کنید ولی با قرار دادن یک الگوریتم مناسب می توانید مقدار کارکرد را از نظر زمان ذخیره کنید.
ولی اگر میخوایید بازی را ذخیره کنید بعد اجراش را به حالت معکوس زمان تماشا کنید شما احتیاج دارید کد های بازی را یعنی اعدادی که باعث حرکت مهره ها میشوند را به همراه کد حرکت در یک فایل مجزا به هنگام اجرا ذخیره کنید و سپس با استفاده از تعداد این کدها در اجرای مجدد استفاده کنید یعنی تعداد کدهای موجود در فایل زمان اجرای برنامه شماست.
موفق باشید.

SamaPic
شنبه 30 خرداد 1388, 10:13 صبح
پس مثل اینکه نمی توانم.
نه دوست من ، من قرار است خودم یک طرف بازی بنشینم و با کامپیوتر مسابقه دهم.می خواهم بدانم وقتی من یک حرکت انجام می دهم به من نشان دهد تا زمان حرکت بعدی از سوی کامپیوتر چقدر مانده.زیرا از توابع سنگین استفاده کردم که فکر کنم برای اجرای هرکدام باید چند ثانیه صبر کنم.
باز هم از شما متشکرم.

دوست من آیا می شود در مورد سوال اول من بیشتر توضیح دهید ؟
چه فرمت هایی ، حداکثر حجم و کیفیت اجرا.
با تشکر.

SamaPic
شنبه 30 خرداد 1388, 10:14 صبح
می شود یک کد کوچک در همین زمینه در اختیار من بگذارید؟

PC2st
شنبه 30 خرداد 1388, 14:03 عصر
یک چیزی مثل loading میخوای دیگه؟ اصولا برای نمایش اینطور موارد به کاربر، بهتره که از thread ها استفاده بشه.

اگه از حلقه‌ها استفاده کردی، مثل حلقه for، متغیر شمارنده‌ای مثل i رو میشه به کاربر نشان داد یا اگه از حلقه while استفاده شده هم به کمک ترفندهایی میشه. اگه هم مثلا ۱۰ تا تابع داری که پشت سر هم باید اجرا بشه، مابین اجرای هر دو تابع، یک متغیر رو که هر بار یک واحد بهش اضافه میشه رو بزار و مقدارش رو بعد از اجرای هر تابع به کاربر نشون بده. کلا بستگی به کد داره و بالاخره به یک طریقی میشه بطور تقریبی کاربر رو از روند اجرای کار مطلع کرد.

SamaPic
شنبه 30 خرداد 1388, 15:23 عصر
با سلام.
دوست من ، من می خواهم چیزی حدود 40 تا تابع را یکبار بدون نمایش و زدن دکمه ای برایم اجرا کند و پس از پایان اجرا به ابتدای کار برگردد.
درست است ، من یک چیزی شبیه loading می خواهم.خب من الان اگر بخواهم با ورود به برنامه چنین کاری انجام شود و سپس در انتهای کار زمان را ذخیره کند و بر 100 تقسیم کند ، چه باید انجام دهم.
آیا تابع یا دستور خاصی برای اینکار وجود دارد.
نمی خواهم یک loading ظاهری داشته باشم.یعنی فقط یک loading را نماشی دهم.می خواهم تابع loading ام خودش کاری انجام دهد.نه اینکه یک rectangle بگذارم و مختصات آن را کم و زیاد کنم تا یک loading زیبا از کار در آید.

PC2st
شنبه 30 خرداد 1388, 18:54 عصر
فکر کنم در برداشت منظور همدیگه سوء تفاهمی بوجود اومده... منظور من تقریبا چیزی شبه این هست، برنامه زیر رو اجرا کنید:


#include <iostream>

using namespace std;

unsigned int counter = 0;
unsigned int old_counter = 0;


void update_loader ()
{
if (old_counter + 10 < counter)
{
old_counter = counter;
cout << "-" << flush;
}
}

void nojob () {/*empty*/}

void dooo () {int i; for (i = 0; i < 999999; ++i) {nojob ();}}

// do jobs but don't update loading shape
void do0 ()
{
int i;
for (i = 0; i < 100; ++i)
{
// do jobs here!
dooo (); dooo (); dooo ();

// update counter
++counter;
}
}

// do jobs and update loading shape
void do1 ()
{
int i;
for (i = 0; i < 200; ++i)
{
// do jobs here!
dooo (); dooo (); dooo ();

// update counter
++counter;

// update loader
update_loader ();
}
}

// do more jobs and update loading shape
void do2 ()
{
int i;
for (i = 0; i < 100; ++i)
{
// do jobs here!
dooo (); dooo (); dooo (); dooo (); dooo (); dooo (); dooo (); dooo ();

// update counter
++counter;

// update loader
update_loader ();
}
}

int main ()
{
do1 ();

do0 ();
// because do0 funcion whill not update loading shape
update_loader ();

do2 ();

do0 ();
// because do0 funcion whill not update loading shape
update_loader ();

do1 ();

return 0;
}
البته باید اونها رو بعنوان اعضای یک کلاس تعریف و پیاده سازی کرد. و همچنین این کد، عملیات رو برحسب درصد مشخص نمیکنه (برای این مورد، به کدهای نوشته شده بستگی داره و یافتن ماکزیمم بطور تقریبی (نه دقیق) کفایت میکنه)، و اگه تعداد عملیات زیاده (تنوع در اجرای توابع) میشه بجای اینکه در داخل حلقه‌ها به counter اضافه کنیم، بعد از اجرای هر تابع به مقدار counter اضافه کنیم. بهتر است که توابعی که وظیفه تصمیم گیری در نحوه حرکت مهره کامپیوتر دارند نیز در یک thread جدا قرار گیرد و همچنین تابع update_loader هم تحت یک thread جداگانه شروع به رسم و بروزرسانی loading کند (که برای اینکار در داخل این تابع باید یک حلقه تکرار گذاشت تا همواره شرایط را چک و بررسی کند تا به محص پایان محاسبات و شروع حرکت مهره کامپیوتر، از کار بایستد).


درست است ، من یک چیزی شبیه loading می خواهم.خب من الان اگر بخواهم با ورود به برنامه چنین کاری انجام شود و سپس در انتهای کار زمان را ذخیره کند و بر 100 تقسیم کند ، چه باید انجام دهم.
آیا تابع یا دستور خاصی برای اینکار وجود دارد.خب اگه چیزی شبیه به loading میخواهید چه نیازی به دانستن مدت زمان اجرای کار هست؟

SamaPic
شنبه 30 خرداد 1388, 19:04 عصر
با سلام.
خیلی ممنون دوست من .
ولی این آنی که من می خواستم نیست.
کلا دلیل اینکه من تابع یا دستور loading دقیق می خواهم این است که قصد دارم ثانیه معکوس داشته باشم.نه اینکه فقط یک شکل نمایش دهم.

mortezamsp
چهارشنبه 03 تیر 1388, 10:41 صبح
با سلام.

بابا چرا اینهمه علکی خودتونو اذیت میکنین؟میخواین از اونهایی بسازین که مثلا اول بازها داره لود میشه؟خب مثلا اگه برنامتون ده قسمت داره علکی برای هر قسمتی یه درصدی تعریف کنین.مثلا برای هر قسمت از کار ده درصد تعیین کنین و وقتی اون کارتموم شد اون رو ده درصد اظافه کنین.به زمان هم کاری نداشته باشین.




f1()
{
...
t+=10%//end
}
f2()
{
...
/*at end */ t+1=10%
}
...
...
...



امیدوارم ... خدا کنه که منظورت همین بوده باشه.آره؟درسته؟

PC2st
چهارشنبه 03 تیر 1388, 13:03 عصر
در اینجا بحث در مورد نیاز به محاسبه دقیق زمان هست. به طور تقریبی (و گاهی مواقع خیلی تقریبی) میشه زمانی واسش محاسبه کرد اما بطور دقیق (یا حداقل با دقت زیاد) کار ساده‌ای نیست و شاید هم غیر ممکن باشه. بعنوان مثال CPU در هر لحظه می‌تونه در اجرای دستورات برنامه ما توقف کنه و پروسه‌ی دیگری رو اجرا کنه (از یک برنامه دیگه) و دوباره به اجرای دستورات برنامه ما برگرده. که اینها روی سرعت اجرای برنامه ما (و به طبع مدت زمان اجرای اونها) تاثیر می‌گذاره.