PDA

View Full Version : سوال: نگه داشتن یک Thread تا رسیدن یک Thread دیگه به جای مشخص شده



UfnCod3r
چهارشنبه 27 شهریور 1392, 18:47 عصر
سلام
من دو تا Thread اصلی دارم
ی تابعی رو می خوام اجراکنم فقط تو thread2 کار می کنه . ولی من تو thread1 هستم.
برای حل این مشکل می خوام پارامترها تابع رو به صورت گلوبال ذخیره کنم بعد تا وقتی که thread2 به قسمتی که می خوام نرسیده صبر کنه و بعد که اون قسمت تموم شد کارشو ادامه بده :گیج:
خودم دقیقا نمی دونم چی کار کنم با WaitFor.. و .. باید ی جوری کنترل کنم.
ممنون. درضمن Win32 باشه .
:قلب:

fahimeh1512
پنج شنبه 28 شهریور 1392, 23:52 عصر
منظورت از این که تو thread1 هستی چیه؟ اگه با یه دستور این دوتانخ رو ساختی هر دو دارن همزمان پیش میرن و هیچ امتیازی نسبت به هم ندارن
تو نخ دوم هم بستگی داره اون قسمتی که میخوای برنامه بهش برسه چی باشه وقتی متیغراتو گلوبال تعریف کنی بادستورای شرطی ساده احتمالا میشه منتظر موند

UfnCod3r
جمعه 29 شهریور 1392, 10:15 صبح
نه ببین خوب دو تا خط که هم دارن واس خودشون می رن من می خوام ی تابعی رو تو Thread1 صدا زدم صبر کنه تا Thread2 برسه به جایی که می خوام و بعد دستور رو اجرا کنه و ..
ی همچین جیزی خودم نوشتم نتیجه داد:لبخند:


BOOL gAppLoop = true;
HANDLE gEvent = nullptr;
volatile BOOL gDoCommand = FALSE;
HANDLE gThreads[2];


void DoCommand()
{
if(gDoCommand)
{
//call function ...
SetEvent(gEvent);
gDoCommand = false;
}
}

DWORD Thread1(void* ptr)
{
while(gAppLoop)
{
if(rand() % 33 = 2)
{
gDoCommand = true;
::WaitForSingleObject(gEvent, INFINITE);
}
//...
}
}

DWORD Thread2(void* ptr)
{
while(gAppLoop)
{
DoCommand();
//...
}
}

int main(int argc, char** argv)
{
lThreads[0] = ::CreateThread(nullptr, 0, Thread1, nullptr, 0, nullptr);
lThreads[1] = ::CreateThread(nullptr, 0, Thread2, nullptr, 0, nullptr);
gEvent = ::CreateEventA(nullptr, TRUE, FALSE, nullptr);
::WaitForMultipleObjects(2, lThreads, true, INFINITE);
}

Felony
پنج شنبه 04 مهر 1392, 18:07 عصر
با Critical Section (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682530(v=vs.85).aspx) میتونی پیادش کنی .

fjm11100
پنج شنبه 04 مهر 1392, 19:52 عصر
راه خیلی ساده اش یک flag است که مثلا صفره و با رسیدن به اون خط یک میشه و ترد منتظر فقط این فلگ را چک میکنه

UfnCod3r
جمعه 05 مهر 1392, 10:58 صبح
با Critical Section (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682530%28v=vs.85%29.aspx) میتونی پیادش کنی .

Critical Section (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682530%28v=vs.85%29.aspx) ها رو بلدم ولی تو این جایی که من می خواستم فکر نکنم بکار بیاد .:متفکر:
البته فکر کنم با ی چنین چیزی بشه

DWORD Thread1(void* ptr)
{
while(gAppLoop)
{
if(rand() % 33 = 2)
{
gDoCommand = true;
::WaitForSingleObject(gCiritialSection, INFINITE);
}
//...
}
}

DWORD Thread2(void* ptr)
{
while(gAppLoop)
{
EnterCiritialSection(gCiritialSection);
//codes
LeaveCiritialSection(gCiritialSection);
}
}


بحرحال مشکل حل شده ممنون از همگی :بوس: