• 0
خالد باشنتوف

مساعده في عمل Thread

سؤال

السلام عليكم

لدي مشروع يحتوي على ( زر + صورة جيف متحركه تدل على البحث ) عند النقر على الزر اريد ان تظهر الصوره لكي يفهم

المستخدم انه جاري البحث

هذه هي تسلسل الكود داخل الزر :

1- إظهار الصورة المتحركه
2 - أكواد البحث من الانترنت وجلب المطلوب
3- إخفاء الصوره المتحركه

المشكله هي تعليق البرنامج ( البرنامج لا يستجيب ) عند البحث في الانترنت لذلك لا تظهر الصوره أثناء تعليق البرنامج وعند انتهاء

البحث ينتهي التعليق لكن مع اخفاء الصوره  كيف اجعل كود البحث لا يأثر على البرنامج ... قرأة عن Thread ولكن لأعرف كيف

اتعامل معه ممكن مساعده ...
 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

4 إجابة على هذا السؤال .

  • 0

نعم اخي الكريم،

انت بالضبط بحاجة ل thread، هناك عدة تقنيات.

 

الابسط باستخدام thread

1. ننشأ Thread جديدة. ونسند إليها مهمة الحسابات والمعالجة.

2. عن حدث معين (ضغط زر) نقوم بإضهار الصورة (المسؤول عنها هو UI Thread). ونقوم بتشغيل Thread الجديدة.

3. بعد انهاء عملية الحساب نقوم بإخفاء الصورة.

 

ملاحظة: يجب عدم تداخل عمل ال Threads ببعضها، فلا يجوز ل thread الجديدة ان تتحكم بالصورة لانها ليست ملكها بل ملك UI Thread كما قلنا.

لذلك نقوم بأخفاء الصورة بطلب من UI thread.

 

اليك المرفق الصغير.

 

وهذا موضوع جيد ومفيد: البرمجة متعددة المهام Multithreading

 

بالتوفيق،،،

SimpleThreading.rar

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا لك أخي على هذه المعلومات

 

انا أضفت الثرد إلى مشروعي واجهتني بعض الأخطأ حاولت أن أوجد لها حل لكني مبتدأ في هذه التقنيه ( مع العلم ان الكود صحيح كان يعمل قبل أضافة الثرد )

 

هذا هو الكود

 private void pictureBox18_Click(object sender, EventArgs e)        {            pictureBox20.Visible = true;            Thread th = new Thread(goo);           th.Start();        }        public void goo()        {            Translator t = new Translator();            t.SourceLanguage = (string)this._comboFrom.SelectedItem;            t.TargetLanguage = (string)this._comboTo.SelectedItem;            t.SourceText = this._editSourceText.Text;            this.richTextBox1.Text = string.Empty;            this.richTextBox1.Update();            this._translationSpeakUrl = null;            try            {                this.Cursor = Cursors.WaitCursor;                this._lblStatus.Visible = true;//"Translating..."                this._lblStatus.Update();                t.Translate();                this.richTextBox1.Text = t.Translation;                this.richTextBox1.Update();                this._translationSpeakUrl = t.TranslationSpeakUrl;            }            catch (Exception ex)            {                MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);            }            finally            {                //this._lblStatus.Text = string.Format("Translated in {0} mSec", t.TranslationTime.TotalMilliseconds);                pictureBox20.Visible = false;                this._lblStatus.Visible = false;// "Translating..."                this.Cursor = Cursors.Default;            }

 حيث كان الأخطأ ( عملية مسار تنفيذ متداخل غير صالحة: تم الوصول إلى عنصر التحكم '_comboFrom' من مسار تنفيذ غير ذلك الذي تم إنشاء عنصر التحكم نفسه فيه. )

 

انا أستخدم C# 2008

يوجد خظأ عند تشغيل مشروعك الذي ارسلته في  Tasks

using System.Threading.Tasks;

اريد ان اضيف هذه المكتبة إلى مشروعي ما اسم هذا المكتبة لكي أبحث عنها في الانترنت

 

توجد علامه تعجب صفرا على المكتبة Microsoft.CSharp في مشروعك الذي ارسلته

 

والعفو على الإطاله ...

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بسم الله الرحمن الرحيم

الخطأ الواضح لديك، كنت قد اشرت له في ملاحظة ضمن تعليقي السابق.

لا يجوز أن يتداخل عمل ال threads بععضها ببعض، مثلا UI Thread هي المسؤولة عن الواجهة وادواتها مثل textBox, ComboBox, Label لذلك لا يحق لأي Thread اخرى التعديل على احدى هذه الادوات او حتى استخدامها. كل ما تستطيع عمله هو اخبار UI Thread للقيام بتعديل معين.

 

كمثال واقعي: لنفرض لدينا كمية معينة من المواد، بحاجة لنقلها إلى مدينة أخرى، أفضل طريقة لتسريع العمليه، هو بزيادة عدد سيارات النقل (Threads)، حيث ستقوم كل سيارة بنقل جزء معين، فأصبح تنفيذ العملية أسرع، لكن لا يمكن لسيارة معينة التحكم بمواد السيارة الأخرى، فلكل سيارة موادها الخاصة ( موارد thread).

بالتالي تستطيع السيارة الأولى اخبار السيارة الثانية مثلأ انها انهت عملية تنزيل موادها، وحان دور السيارة الثانية.

 

الأمر مشابه لل threads.

ضمن مثالك الميثود goo خاصة ب th thread الجديدة، لذلك يجب أن تحوي على موادها الخاصة، وبحالة أرادت التعديل على عناصر الواجهة، فإنها تطلب من UI Thread عمل ذلك، الأمر موضح بالمثال باستخدام Invoke. 

والأهم: أن عمل thread ذائما يكون مقصور على العمليات الحسابية الطويلة أو الاتصال بقاعدة البيانات. واذا كانت هذه ال thread تتطلب بيانات معينة موجودة على الواجهة مثلا قيمة textBox، لذلك نقوم بحفظ هذه القيمة ضمن متغير عام string، قبل طلب ال thread الجديدة.

 

أرجو أن تكون النقاط واضحة.

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الحمد لله أنتهت المشكلة

 

استخدمة Invoke

 

شكرا لك أخي على هذا التعاون

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .