رفتن به مطلب
مرجع رسمی سی‌پلاس‌پلاس ایران
  • 0
miss_hadis

هنگ کردن و کرش شدن برنامه


سوال

سلام دوستان من یک برنامه کوچیک ساختم مثلاً میاد 20000 هزار تا فایل رو rename می‌کنه با استفاده از thread مشکل هنگ و سرعت برنامه درست شد منتها وقتی داخل بدنه thread این کارو انجام می‌دادم دون دونه فایل‌ها رو تغیر نام می‌داد الان من می‌خوام مثلاً به (تعداد در ثانیه) این کارو انجام بده مثلا 100 تا در ثانیه یا 1000 تا در ثانیه رو بتونه rename کنه حالا اومدم و این کارو انجام دادم ولی برنامه هنگ می‌کنه یعنی هرچقدر تعداد فایل‌ها بیشتر می‌شه هنگ می‌کنه یعنی واسه 1000 فایل و اصلاً مشکلی نداره


void renameStart()
{

        QString root ="E:/myfolder";
        QDirIterator it(root,QStringList() << "*", QDir::Files, QDirIterator::Subdirectories);
        while(it.hasNext();)
        {
            thread1 *myThread;
            myThread = new thread1();
            myThread->strpath = it.next();
            myThread->start();
        }
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    
    QFuture<void> future = QtConcurrent::run(renameStart);
    future.waitForFinished();
    
    return a.exec();
}

قطعه کدی چیزی نیست که بشه کاری کرد که برنامه کرش نشه؟

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

4 پاسخ به این سوال تا کنون داده شده است

پست های پیشنهاد شده

  • 0
در 2 ساعت قبل، miss_hadis گفته است :

سلام دوستان من یک برنامه کوچیک ساختم مثلاً میاد 20000 هزار تا فایل رو rename می‌کنه با استفاده از thread مشکل هنگ و سرعت برنامه درست شد منتها وقتی داخل بدنه thread این کارو انجام می‌دادم دون دونه فایل‌ها رو تغیر نام می‌داد الان من می‌خوام مثلاً به (تعداد در ثانیه) این کارو انجام بده مثلا 100 تا در ثانیه یا 1000 تا در ثانیه رو بتونه rename کنه حالا اومدم و این کارو انجام دادم ولی برنامه هنگ می‌کنه یعنی هرچقدر تعداد فایل‌ها بیشتر می‌شه هنگ می‌کنه یعنی واسه 1000 فایل و اصلاً مشکلی نداره



 
 
 
 
void renameStart()
 
{
 
 
 
QString root ="E:/myfolder";
 
QDirIterator it(root,QStringList() << "*", QDir::Files, QDirIterator::Subdirectories);
 
while(it.hasNext();)
 
{
 
thread1 *myThread;
 
myThread = new thread1();
 
myThread->strpath = it.next();
 
myThread->start();
 
}
 
}
 
 
 
int main(int argc, char *argv[])
 
{
 
QCoreApplication a(argc, argv);
 
 
 
QFuture<void> future = QtConcurrent::run(renameStart);
 
future.waitForFinished();
 
 
 
return a.exec();
 
}
 
 

قطعه کدی چیزی نیست که بشه کاری کرد که برنامه کرش نشه؟

سلام

خب کاری که دارید میکنید یک کار اشتباه و غیر اصولی هست شما دارید به ازای هر فایل یک ترد میسازید که این کار درستی نیست شما باید یه توازنی بین این دو پیدا کنید مثلا ممکنه حالت بهینه برای شما این باشه که هر یک دهم از فایلها رو یک ترد مدیریت کنه میتونید از پارالل فور هم استفاده کنید برای این موضوع که خودش هندل میکنه شما سیستمتون تا یه میزان ترد موازی رو پاسخ میده که بعید میدونم بلاتر از 16 باشه پس سختن تردهای بیشتر هزینه ساخت ترد به ازای هر فایل رو به دوشتون میذاره چون ری نیم کردن فایل کار سنگینی نیست به نظر درست نمیاد.

شما حد اکثر اگر سیستم i7 دارید که 4 هسته فیزیکی داره و 8 هسته مجازی و تا 16 ترد موازی رو پشتیبانی میکنه حد اکثر تعداد تردهای بهینه 16 هست.

بهتره قبل از این که دست به کاری بزنید درموردش مطالعه کنید پیدا کردن میزان ترد بهینه خودش کلی جریان داره اینی که من گفتم از نظر سخت افزاری هست ولی بحث خود کاری که میخواید انجام بدید هم یک تعداد ترد بهینه داره که ممکنه از این تعداد کمتر باشه یعنی ممکنه شما 16 ترد بسازید طولانی‌تر از حالتی باشه که 4 ترد میسازید.

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0

داخل یک ترد غیر از ترد اصلی برنامه تمام فایل‌ها رو rename کنید. زیاد کردن تعداد تردها برای عملیات IO روی فایل خصوصاً در این مورد هیچ کمکی نمی‌کنه که هیچ، به احتمال زیاد سرعت رو هم پایین میاره.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0

از QThreadPool استفاده کن

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

به گفتگو ملحق شوید

شما همین الآن می‌توانید مطلبی را ارسال و بعداً ثبت‌نام کنید. اگر حساب کاربری دارید، و با حساب کاربری خود مطلب ارسال کنید.
نکته: مطلب شما قبل از انتشار نیاز به بازبینی توسط میانجی‌گر‌ها دارد.

مهمان
پاسخ به این سوال ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از ۷۵ اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به عنوان یک لینک به جای

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.


  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×
×
  • جدید...