نگه داشتن یک Thread تا رسیدن یک Thread دیگه به جای مشخص شده
سلام
من دو تا Thread اصلی دارم
ی تابعی رو می خوام اجراکنم فقط تو thread2 کار می کنه . ولی من تو thread1 هستم.
برای حل این مشکل می خوام پارامترها تابع رو به صورت گلوبال ذخیره کنم بعد تا وقتی که thread2 به قسمتی که می خوام نرسیده صبر کنه و بعد که اون قسمت تموم شد کارشو ادامه بده :گیج:
خودم دقیقا نمی دونم چی کار کنم با WaitFor.. و .. باید ی جوری کنترل کنم.
ممنون. درضمن Win32 باشه .
:قلب:
نقل قول: نگه داشتن یک Thread تا رسیدن یک Thread دیگه به جای مشخص شده
منظورت از این که تو thread1 هستی چیه؟ اگه با یه دستور این دوتانخ رو ساختی هر دو دارن همزمان پیش میرن و هیچ امتیازی نسبت به هم ندارن
تو نخ دوم هم بستگی داره اون قسمتی که میخوای برنامه بهش برسه چی باشه وقتی متیغراتو گلوبال تعریف کنی بادستورای شرطی ساده احتمالا میشه منتظر موند
نقل قول: نگه داشتن یک Thread تا رسیدن یک Thread دیگه به جای مشخص شده
نه ببین خوب دو تا خط که هم دارن واس خودشون می رن من می خوام ی تابعی رو تو 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);
}
نقل قول: نگه داشتن یک Thread تا رسیدن یک Thread دیگه به جای مشخص شده
با Critical Section میتونی پیادش کنی .
نقل قول: نگه داشتن یک Thread تا رسیدن یک Thread دیگه به جای مشخص شده
راه خیلی ساده اش یک flag است که مثلا صفره و با رسیدن به اون خط یک میشه و ترد منتظر فقط این فلگ را چک میکنه
نقل قول: نگه داشتن یک Thread تا رسیدن یک Thread دیگه به جای مشخص شده
Critical Section ها رو بلدم ولی تو این جایی که من می خواستم فکر نکنم بکار بیاد .:متفکر:
البته فکر کنم با ی چنین چیزی بشه
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);
}
}
بحرحال مشکل حل شده ممنون از همگی :بوس: