PDA

View Full Version : انجام دادن همزمان دو عمل در C



Random
پنج شنبه 19 خرداد 1384, 23:43 عصر
چطور می شود دو عمل را به طور همزمان در C انجام داد؟ مثلا همزمان که یک حلقه اجرا می شود، یک داده از کیبرد گرفته شود (بدون آنکه حلقه لحظه ای متوقف شود.)
یا به عبارت دیگر :برنامه ای بنویسید که یک کاراکتر از چپ به راست از صفحه عبور کند و کاربر همزمان دو عدد را وارد برنامه کند و آن دو عدد در صفحه چاپ شوند. :wink:

Inprise
پنج شنبه 19 خرداد 1384, 23:49 عصر
Thread

Random
جمعه 20 خرداد 1384, 12:12 عصر
Thread
یعنی چی؟

Inprise
جمعه 20 خرداد 1384, 18:29 عصر
چطور می شود دو عمل را به طور همزمان در C انجام داد؟

Thread

یعنی همین . برای مطالعه جزئیات بیشتر عنوان Thread رو روی فروم جستجو کن ؛ قبلا برای توسعه روی ویندوز و لینوکس مفصلا" در موردش توضیح دادم.

Random
جمعه 20 خرداد 1384, 20:03 عصر
با تشکر اگه می شه لینکش رو بذارید چون من پیداش نکردم
:گیج: :sad2:

Inprise
جمعه 20 خرداد 1384, 22:47 عصر
وارد بخش جستجوی سایت بشو . جستجو رو به قسمت C محدود کن و کلمهء Thread‌رو سرچ کن ؛

Random
شنبه 21 خرداد 1384, 00:13 صبح
وارد بخش جستجوی سایت بشو . جستجو رو به قسمت C محدود کن و کلمهء Thread‌رو سرچ کن
من این کار رو کرده بودم ولی موردی که در ارتباط با thread ها چیزی یاد داده باشه پیدا نشد.
در هر صورت اگه شما یا کس دیگه ای لطف کنید کد کوتاهی بنویسید که طرز استفاده از thread ها در اون مشخص باشه ممنون می شم.(البته من فقط می خوام یک حلقه و تابع getch رو همزمان استفاده کنم)

rezaTavak
شنبه 21 خرداد 1384, 07:52 صبح
سلام





(بدون آنکه حلقه لحظه ای متوقف شود.)





امکان نداره که حلقه ای دائماً در حال گردش باشه و کار دیگه ای بشود کرد!


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

یعنی در حقیقت ویندوز به هر برنامه در حال اجرا یک تایم تخصیص میدهد آن پروسه را اجرا و به سراغ بعدی میرود و از اول تا آخر پروسه ها این کار را انجام میدهد.


در حقیقت ذات یک برنامه ویندوز با یک برنامه داسی فرق دارد. برنامه داس تمام کنترل کامپیوتر (غیر از وقفه ها که اجرا می شوند) را در دست میگیرد و فقط آن برنامه در حال اجرا خواهد بود اما برنامه تحت ویندوز کار شکل متفاوتی دارند و برای کارهای خود مجبورند از ویندوز وقت بگیرند! اگر یک برنامه تحت ویندوز قفل کند همان برنامه را می توان از حافظه خارج کرد اما تحت داس بایستی کامپیوتر ریست شود.






یا به عبارت دیگر :برنامه ای بنویسید که یک کاراکتر از چپ به راست از صفحه عبور کند و کاربر همزمان دو عدد را وارد برنامه کند و آن دو عدد در صفحه چاپ شوند.




شما کاری که باید انجام دهید به طور ساده این است:
1- صفحه کلید چک شود آیا کاراکتری وارد شده؟ اگر وارد شده آن دریافت شود. و اگر پایان عملیات است از این حلقه خارج شود.
2- کاراکتر از چپ به راست یک خانه منتقل گردد.
3-به مرحله 1 برو.

karim_medusa
شنبه 21 خرداد 1384, 08:24 صبح
چطور می شود دو عمل را به طور همزمان در C انجام داد؟ مثلا همزمان که یک حلقه اجرا می شود، یک داده از کیبرد گرفته شود (بدون آنکه حلقه لحظه ای متوقف شود.)
یا به عبارت دیگر :برنامه ای بنویسید که یک کاراکتر از چپ به راست از صفحه عبور کند و کاربر همزمان دو عدد را وارد برنامه کند و آن دو عدد در صفحه چاپ شوند. :wink:

دوست عزیز تابع kbhit رو امتحان کن !
با این تابع می تونی همزمان هم از صفحه کلید ورودی بگیری! با کمک تابع getch

سپول
شنبه 21 خرداد 1384, 13:30 عصر
همونطور که بقیه هم گفتند شما باید با thread ها کار کنید.
هر برنامه یک loop هست ، حالا اگر شما بخواهید در یک برنامه چند loop درست کنید به طوری که ویندوز آنها رو (مجازی) به طور همزمان اجرا کند با thread بسازید. مبحث multithreading هم خیلی مبحث پیچیده و طولانی هست ، ولی واسه شروع اگر می خواهی thread بسازی اینجوریه :
اول یک function تعریف می کنی که توش در واقع هر کدی می تونی بنوسی که جدا از کد اصلی برنامه و همزمان اجرا می شه .

DWORD WINAPI MyThread(void* param)

با این خط هم توی برنامه اصلی می تونی thread رو بسازی که در یکی از پارامترهاش آدرس MyThread هست.

CreateThread(0, 0,MyThread, NULL, 0, NULL)
iهمون موقع که thread ساخته می شه برنامه اصلی به کارش ادامه می ده و کد داخل MyThread هم به طور همزمان اجرا می شه.
برای اطلاعات بیشتر به MSDN مراجعه کن.

مهدی
شنبه 21 خرداد 1384, 13:39 عصر
برای کاری که تو میخوای اصلا thread لازم نیست! این کد رو نگاه کن تا ببینی چی میگم. اونو من برای این نوشته بودم که توی یه Editor وقتی منتظره تا کلید زده بشه همزمان ساعت رو هم نشون بده:


unsigned char getkey()
{
static struct time t;
static char s[9];
while(!kbhit())
{
gettime(&t);
sprintf(s,"%2d:%02d:%02d",t.ti_hour, t.ti_min, t.ti_sec);
print(70,0,showtime?s:" ",0x71);
}
return(getch());
}


من توی کد برنامم برای گرفتی کلید بجای getch از این تابع استفاده میکردم

سپول
شنبه 21 خرداد 1384, 15:16 عصر
درسته برای کاری که شما می خوایین thread لازم نیست ، من post اول رو خوندم و post های بعدی رو دقت نکردم ، فکر کردم کلی می گی

Random
شنبه 21 خرداد 1384, 17:04 عصر
از همه ی دوستان متشکرم :)
Inprise
rezaTavak
karim_medusa
سپول
مهدی
برنامه استاد شد. :wink:

daneshjoye_azad
چهارشنبه 03 خرداد 1385, 16:03 عصر
سلام
ببین عزیزم برای اینکه برنامه برای شمال دو کار را انجام بده باید کل دستورات رو تو یه یه حلقه for بینهایت بزاری و او کازهایی زو که میخوای با کنترل خودت انجام بشن رو توی دستور زیر بزاری
یه if مینویسی که شرط اون عباری ()kbhit باشه حالا یه getch

daneshjoye_azad
چهارشنبه 03 خرداد 1385, 16:05 عصر
میدی
و ادامه کار .ببخشین چون کار دارم ادامه رو اگه خواستی میتونی براک پیام بزاری.

c programmer
پنج شنبه 04 خرداد 1385, 17:45 عصر
سلام.

من هم دقیقا همین مشکل رو دارم. می خوام یه حلقه با شرط while(1) داشته باشم (فرض کنید توش یک انیمیشن انجام میشه) و در عین حال به کدهای برنامم برسم.

اون روشی که آقای سپول گفتن رو نتونستم درست به کار ببریم. میشه یه مثال ساده بذارین؟
لطفن منطق برنامم رو هم عوض نکنید(بحث رو عوض نکنین)

خیلی لازمش دارم. ممنون.

active66
جمعه 05 خرداد 1385, 01:31 صبح
سلام دوست عزیز.
فکر کنم منظورت یه برنامه شبیه برنامه زیره.

#include <conio.h>
#include<iostream.h>

int main(void)
{ char ch;
for (;;){
cprintf("a");
if (kbhit())
cout<<"b";

}
return 0;
}

c programmer
جمعه 05 خرداد 1385, 21:53 عصر
ممنون که جواب دادین. اما منظورم مشخصه که این نیست. من یه مثال زدم که یه کاراکتر بگیرد.
بذارید اینجوری بگم:
من می خوام موس درون برنامه کار کنه و میدونید کد موس یه حلقه ی بی نهایته!
حالا من میخوام علاوه بر موس با صفحه کلید هم کار کنم. یعنی کلی کد و تابع دیگه باید خارج این حلقه و البته همزمان با آن انجام گیرد.
حالا چی؟؟؟

mr_esmaily
شنبه 06 خرداد 1385, 13:11 عصر
سلام

وارد بخش جستجوی سایت بشو . جستجو رو به قسمت C محدود کن و کلمهء Thread‌رو سرچ کن ؛

شرمنده , بنده هم تاپیکی با این مضمون که نویسندش شما باشین پیدا نکردم.
درصورت امکان لینک اون تاپیک رو ذکر کنید.

daneshjoye_azad
شنبه 06 خرداد 1385, 16:08 عصر
ببین عزیزم

من اینطوری شروع میکنم که ما یه قایق داریم که باید توی یه مسیر یه حرکت رفت و بر گشت داشته باشه .

یه زیر دریایی دشمن هم داریم که باید به طور خودکار حرکت کنه مثل قایق .


حالا ما یه زیر دریایی داریم که تحت کنترل ما هستش و میخواهیم یه بازی بسازیم که همه این کارها رو داشته باشه .

daneshjoye_azad
شنبه 06 خرداد 1385, 16:14 عصر
حالا ما میایم یه حلقه بینهایت میسازیم و توی اون میایم توابعی که قایق و زیر دریایی دشمن رو حرکت میده توی اون میذاریم .


بعد اینکه این توابع رو قرار دادیم یه if میذاریم که شرط اون ()kbhit هستش و حالا توی اکولاد if
یه switch میزاریم که switch میکنه getch رو .

حالا میتونی توی case هات تعریف کنی که اگه کلید مثلا w فشرده شد کار فلان ! رو انجام بده .



این هم از توضیح من ................................

daneshjoye_azad
شنبه 06 خرداد 1385, 16:16 عصر
حالا اگه هنوز متوجه نشدی یه ایمیل بزن برام تا یه نمونه برنامه برات بفرستم .


خوب .