PDA

View Full Version : سوال: زمان در ++C.....؟



graphic.online9
جمعه 20 دی 1387, 02:04 صبح
سلام به دوستانه عزیز...
در مورد sleep در 4.5++C می خواستم بدونم نحوه درست کارش با یه مثال قابل اجرا
ممنون...

emad_67
جمعه 20 دی 1387, 12:13 عصر
سلام به دوستانه عزیز...
در مورد sleep در 4.5++C می خواستم بدونم نحوه درست کارش با یه مثال قابل اجرا
ممنون...
در c++4.5 رو خبر ندارم ولی تابع Sleep یه وقفه ای رو در کار ایجاد میکنه، مثلا به مدت هر چند ثانیه ای که بخوای میتونی پروسه رو متوقف کنی:


#include "stdafx.h"
#include <iostream>
#include<windows.h>
using namespace std;
//---------------------------------------------------------------------------
void main()
{
int i=0;
for(;;)
{
cout<<i++<<" ";
Sleep(1000);
}
}

درwindows.h هم قرار داره.

Saeed_m_Farid
جمعه 20 دی 1387, 13:12 عصر
سلام به دوستانه عزیز...
در مورد sleep در 4.5++C می خواستم بدونم نحوه درست کارش با یه مثال قابل اجرا
ممنون...
با تشكر از emad_67 ميخواستم چند تا مطلب به گفته دوستمون اضافه كنم :

1- تابع sleep عليرغم شكل ساده اي كه داره تو اكثر سيستمهاي همزمان به همراه ساير توابع در پروسسها و thread ها نقش اصلي رو بازي ميكنه و جزئي از kernel32 ويندوزه، تو بكارگيري اين تابع در thread ها بايد كاملا مراقب باشيد چون پروسس جاري رو متوقف ميكنه و ممكنه باعث بوجود آوردن بن بست تو برنامه شما بشه يه نمونه ساده اش همين برنامه هاي ساده سي كه فقط يه پروسس main ايجاد ميكنن هست: اگه شما اين تابع رو تو يه حلقه بي پايان همونطوريكه emad_67 گذاشتن بذاريد كه خوب اين مورد عمدي بوده ولي در برخي موارد كنترل برنامه طوري پيش ميره كه همچين حالتي پيش مياد؛ در اين حالت كل روند برنامه رو متوقف ميشه!
فرض كنيد همچين حالتي تو پروسس هاي ديگه شما كه مثلا تو thread هاتون كه پنجره اي هم دارن، پيش بياد در اينحالت پس از مدتي برنامه بدون اينكه متوجه بشين مشكل از كجاست متوقف ميشن و پنجره ها ديوار ميشن! و تمام روالهاي شما تحت تاثير قرار ميگيره!
براي استفاده درست Sleep تو thread ها بايد يه time-out‌ هم بذارين كه در اونصورت Sleep اجرا نشه يا اگه تو اينكار هم محدوديت داشتين بايد علاوه بر Sleep يه مديريت پيغام هم تو سيستمتون تعبيه كنيد كه با پيغام MsgWaitForMultipleObjects بتونين به ساير پيغامهاي ويندوز يا thread هاتون هم برسيد اين مبحث يه كمي طولانيه ولي اگه مشتاق بودين تو يه تاپيك ديگه ميتونيم در مورد نحوه پياده سازيش صحبت كنيم.

2- اگه تابع Sleep‌ (كه مقدار ورودي از نوع هزارم ثانيه ميگيره) صفر بدين؛ درون thread ها باعث ميشه كه thread ديگه اي كه اولويت همزمان با thread موردنظر داره جلوتر بيافته و اگه بخواين يه Sleep بينهايت داشته باشيد بايد مقدار INFINITE بهش بدين.

3- ليست ساير توابع مفيد در زمينه threading رو هم ميتونين اينجا ببينين :





AttachThreadInput
CommandLineToArgvW
CreateProcess
CreateProcessAsUser
CreateRemoteThread
CreateThread
ExitProcess
ExitThread
FreeEnvironmentStrings
GetCommandLine
GetCurrentProcess
GetCurrentProcessId
GetCurrentThread
GetCurrentThreadId
GetEnvironmentStrings
GetEnvironmentVariable
GetExitCodeProcess
GetExitCodeThread
GetPriorityClass
GetProcessAffinityMask
GetProcessShutdownParameters
GetProcessPriorityBoost
GetProcessTimes
GetProcessVersion
GetProcessWorkingSetSize
GetStartupInfo
GetThreadPriority
GetThreadPriorityBoost
GetThreadTimes
OpenProcess
ResumeThread
SetEnvironmentVariable
SetPriorityClass
SetProcessAffinityMask
SetProcessShutdownParameters
SetProcessPriorityBoost
SetProcessWorkingSetSize
SetThreadAffinityMask
SetThreadIdealProcessor
SetThreadPriority
SetThreadPriorityBoost
Sleep
SleepEx
SuspendThread
SwitchToThread
TerminateProcess
TerminateThread
TlsAlloc
TlsFree
TlsGetValue
TlsSetValue
WaitForInputIdle



4- همونطوريكه گفتم اين تابع عضوي از كرنل ويندوز (95 به بعد) هست و واسه لينوكس بايد از روتين هاي كتابخانه usleep استفاده كنيد.

اميدوارم مطالب بدرد دوستان خورده باشه و علاقمنداني واسه ادامه مطلب داشته باشيم...
با تشكر.