سؤال

وهكذا، أنا بعمل مسح بسيط للحصول على قائمة من كافة المجلدات على القرص الصلب (C: \ WINDOWS وج: تعتبر مداخل منفصلة \ نوافذ \ SYSTEM32). إذا أردت أن تقدم شريط التقدم لهذه المهمة 1-2 دقيقة، كيف أفعل ذلك؟ وهذا هو، وأنا أعرف كيفية جعل progressbar ولكن لست متأكدا من كيفية تحديد مقدار من العمل ليتم ذلك.

وتحرير: لاحظ أن أداء PRESCAN ليس حلا، لأن هذا المسح هو الحصول فقط على قائمة من المجلدات ومن شأنه أن PRESCAN تأخذ فقط طالما

ورمز عينة أدناه. فإنه يأخذ أقل من 2 دقيقة لتشغيل نظيفة على نظام بلدي، ولكن أقل من 10S لتشغيل 2nd الوقت بسبب التخزين المؤقت الوصول إلى القرص. لقد خلق تنويعات على هذا أن تستند كومة بدلا من العودية القائمة.

وآلية واحدة لقد وجدت أن ربما لا يمكن الاعتماد عليها بنسبة 100٪ ولكن أسرع بكثير من بلدي المسح هو أنبوب "دير / ق / أ ب / ب" لبرنامجي والاعتماد حالات السطر الجديد. دير يفعل نوعا من السحر الذي يقوم بعمل أفضل بكثير مسح بلدي HD من برنامجي، ولكن أنا لا أعرف ما هو هذا السحر.

class Program
{
    static void recurse(string pos)
    {
        DirectoryInfo f = new DirectoryInfo(pos);
        try
        {
            foreach (DirectoryInfo x in f.GetDirectories("*"))
            {
                recurse(x.FullName);
            }
        } catch (Exception) {}
    }
    static void Main(string[] args)
    {
        recurse("c:\\");
    }
}
هل كانت مفيدة؟

المحلول

إذا كنت لا يمكن لعنة بنية الدليل لأن ذلك يستغرق ما دام تنفيذ المهمة في المقام الأول، وأفضل ما يمكنك فعله هو تخمين عدد المجلدات هناك. عنجد.

وربما يمكنك استخدام خوارزمية تقوم على التاريخ الماضي (على سبيل المثال آخر مرة فعلت ذلك كان هناك 150 الدلائل في المجموع عندما كان هناك 10 الدلائل على مستوى عال، وبالتالي تخمين جيد سيكون 15 أضعاف العدد الحالي من الأعلى- الدلائل مستوى).

وهناك طريقة أخرى لأقول شيئا المستخدم سوف يستغرق بعض الوقت (دون أن يعرفوا بالضبط كم من الوقت) هو استخدام للعد التنازلي. حتى لو كنت قد خمنت أن شيئا ما سوف يستغرق وقتا أطول مما هو عليه في الواقع و(مثلا 5 دقائق عندما يكون حقا مهمة بعد 3 دقائق)، على الأقل كان المستخدم يعرف تقريبا كم من الوقت سيستغرق. وأنها سوف تكون أكثر سعادة عندما تنتهي أسرع مما قيل أنه سيكون. والمشكله الوحيدة، بالطبع، هو إذا كنت تخمين خاطئ على الجانب الآخر، أي إذا كان هناك شيء وقتا أطول مما كنت اعتقد انه سيكون. ثم انهم يجلسون هناك في انتظار شيء لإنهاء هذا (في أذهانهم) يجب الانتهاء بالفعل.

نصائح أخرى

إذا كنت بحاجة إلى جعل شريط تقدم وأنت لا يمكن تجنيب الوقت الذي يستغرقه لجمع معلومات دقيقة، ثم أنت لن تكون قادرة على تقديم شريط تقدم الكمال. مع هذا الافتراض في الاعتبار، لا يزال بإمكانك جعل شريط التقدم غير دقيقة تماما.

وعلى سبيل المثال، يمكنك جعل وظيفة أن يقسم شريط التقدم اعتمادا على عدد من الدلائل في الدليل الحالي. حتى إذا كان الدليل الجذر لديه 10 الدلائل، وتخصيص 10٪ من شريط التقدم إلى كل من هذه الدلائل. ثم، أدخل إلى الدليل الفرعي الأول والاعتماد الدلائل الخاصة به. إذا كان لديه 5، وتخصيص 20٪ من أول 10٪ من شريط التقدم إلى كل من هذه (2٪ من إجمالي شريط التقدم). يستمر مثل هذا حتى تصل إلى الدليل مع عدم وجود الدلائل، لا معالجة الخاص بك هناك وزيادة شريط التقدم مهما كان مبلغ كسور التي تمثلها.

وسيكون لكل٪ على شريط التقدم لا يمثل نفس كمية العمل المنجز من قبل الخوارزمية، ولكن نظرا contraints الخاص أشك في أنك تستطيع أن تفعل أفضل من ذلك بكثير.

وفقط لا يستخدمونه. جرب شيئا أكثر ملاءمة مثل الرسوم المتحركة الغزل أو كيتس شريط نمط: http://en.wikipedia.org/wiki/ كيت .

ويمكنك أن تفعل ذلك في عدد قليل من الطرق .... عملية بسيطة قد لا تكون دقيقة بنسبة 100٪.

وقبل أن تبدأ، والحصول على عدد من الملفات، ثم استخدام ذلك لحساب النسبة المئوية من الانتهاء، بعد معالجة X ملفات التحديث والتقدم. منحت هناك تكلفة أداء البحث. ربما مجرد الحصول على عدد من الدلائل الجذر، وكما كنت اجتياز تحديث التقدم.

وربما يكون هناك خيار آخر لمجرد تسجيل عدد من التفاصيل "الماضي البعيد"، واستخدام ذلك لحساب النسبة المئوية، مرة أخرى، وليس بالضرورة دقيقة بنسبة 100٪، ولكن خيارا.

واعتقد عدد قليل من الأشياء الأخرى التي تتبادر إلى الذهن هي أن تظهر ببساطة المستخدم "في التقدم" الحوار وليس حتى محاولة الحصول على نسبة مئوية. خلاف ذلك، ربما تظهر فقط دليل العمل الحالي، والتي تبين أنك تحرز تقدما.

وحاولت الاستيلاء على stdoutput من "dir/ad/b/s c:/" وحساب عدد خطوط. هذا هو سريع جدا. انها جديرة بالثقة بما فيه الكفاية للاستخدام في progressbar ولكن ليس جديرا بالثقة بما فيه الكفاية لاستخدامها بوصفها قائمة الأدلة.

ويمكنك إنشاء شريط تقدم مع تزايد الحد الأقصى وقيمة الممتلكات. إذا كان لديك الممتلكات الخاصة بك القصوى حدد في البداية 100، على هاتفك الحدث التجزئة الموقت، وزيادة كل من الحد الأقصى والقيمة بنسبة 1 على سبيل المثال لذلك عليك أن القيم المذكورة أدناه ...

         Maximum    Value 
Tick1:    101          1   - 1% 
Tick2:    102          2   - 2%
Tick3:    103          3   - 3% 
TickN:    100+n        n 
Finish    100+n      100+n - 100%  --> force to fill the progress bar

ويمكنك تجربة على القيمة القصوى الأولية أن يكون شريط التقدم تتحرك أكثر سلاسة.

ولقد استخدمت طريقة Catchwa ل. أنا وضعت مجموعة التقدم إلى 14000 لأن أنظمة تشغيل على نظام بلدي لها عن ذلك العديد من تطبيق الاستعراض المفصل. عندما وجدت في دير فارغ، وأضاف لي كسور، كمية المرجح أن شريط التقدم. كمية كونها مبنية على عمق وتطبيع مع مجموعة. في كل اجتياز الشجرة الفرعية في نهاية المطاف ينتهي بك الأمر مع دير فارغة ووزن كل دليل فرعي فارغة في دير تتكون من وزن دير، ولكن كسر في قطع. عندما وجدت دير غير فارغة I تخزين عدد من دليل فرعي في الخريطة. حصلت، وذلك باستخدام كيو تي:

emit findProgressBar_setRange(14000); ... if (dir.size()) { m_dirsAtDepth[++m_depth] = dir.size(); } else { qreal product = 1.00; for (int i = 1; i <= m_depth; ++i) { product *= m_dirsAtDepth[i]; } int x = qRound((1.00 / product) * 14000); emit findProgressBar_addValue(x); }

وتشغيله على نحو سلس جدا، وانها رخيصة. كما أود أن أتقدم المستخدم ودقيقة الخيار شريط التقدم حيث أنا أعول العدد الإجمالي للتطبيق الاستعراض المفصل لأول مرة، والتي يمكن أن تكون مكلفة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top