PDA

View Full Version : مدیریت نخ worker و کنسل کردن waitForConnected



weox__
سه شنبه 30 خرداد 1391, 11:32 صبح
با سلام

من یه نخ worker دارم که وقتی می رسه به :


if(!mySocket->waitForConnected(30000)){
emit ErrorMessage(QString("Error"),mySocket->errorString());
return ;
}


حالا فرضا یوزر تو این سی ثانیه عملیات رو می خواد کنسل بکنه . چطور باید این کار رو بکنم ؟؟

weox__
پنج شنبه 01 تیر 1391, 22:15 عصر
کسی در این مورد تجربه نداره ؟؟

حامد مصافی
جمعه 02 تیر 1391, 11:13 صبح
timeout رو کمتر در نظر بگیر. برای بررسی لغو از یک متغیر کمکی استفاده کن که از جای دیگری می‌تونه تغییر کنه. حالا در بین این فواصل کوتاه‌تر timeout می‌تونی اون متغیر رو چک کنی

weox__
جمعه 02 تیر 1391, 12:57 عصر
چطور می شه با eventloop این کاری که من یم خوام بکنم رو پیاده کرد ؟؟

راه مستقیمی برای تمام کردن بلافاصله ی یه نخ وجود نداره ؟؟

حامد مصافی
جمعه 02 تیر 1391, 13:44 عصر
من رفتم سورس مربوطه رو بررسی کردم. از یک حلقه استفاده شده. eventloop نداره. شما همون کاری رو که گفتم انجام بده و برای اینکه برنامت هنگ نکته این عمل رو به یک thread دیگه منتقل کن

weox__
جمعه 02 تیر 1391, 14:58 عصر
من رفتم سورس مربوطه رو بررسی کردم. از یک حلقه استفاده شده. eventloop نداره. شما همون کاری رو که گفتم انجام بده و برای اینکه برنامت هنگ نکته این عمل رو به یک thread دیگه منتقل کن

دقیقا همین طوره . توی یه نخ دیگه هستش !!
ولی خوب یه جورایی وصله پینه ای می شه اونطوری و real time نیست.(من خودم 1 ثانیه گذاشتم . هر 1 ثانیه چک میکنه کاربر کنسل کرده یا نه )

تو irc کسی جواب نداد یه نفر گفت با eventloop پیاده اش کن که اونم من چیز درست حسابی تو نت پیدا نکردم .

حامد مصافی
جمعه 02 تیر 1391, 16:16 عصر
... وصله پینه ای می شه...
این تابع در اصل از یک while استفاده می‌کنه. خب شما می‌تونی به جای استفاده از این تابع یک while برای خودت بنویسی که در لابلای تکرار‌ها دستور کنترلی خروج از حلقه رو برای لغو عملیات رو هم اضافه کنی. این به نظر من وصله پینه کردن نیست. بعضی وقت‌ها توابع برای منطور‌های خاصی نشده شده‌اند که باب نیاز ما نیستند و مجبوریم تابع خاص خودمونو بنویسیم.

من گمان می‌کنم کسی که در IRC شما رو راهنمایی کرده منظورش همین بوده. در واقع شما می‌تونید عملیاتی رو که عرض کردن در یک QEventLoop پیاده سازی کنید و اونو exec کنید. و در حالت دلخواه برای لغو عملیات بهش خاتمه بدید. در کل باید قید این تابع waitForConnected رو بزنید. اون برای نیاز شما طراحی نشده!