الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ظهر خطأ لدي اثناء التعامل مع ال Threading

بدأه dot.net2008 في 2 فبراير 2010 · 5 رد · 1,158 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

اخواني الكرام ارجوا ان تكونوا بكامل الصحة والعافية

لدي حالياً برنامج عملت عليه من خلال ال Threading وشغال تمام ,,

ولكن عند تجريب عمل Threading بهذه الطريقة

  Dim kkk As New Thread(AddressOf cam)

وقمت باستدعاء الاجراء cam بهذه الطريقة

sub cam 

    Dim iHeight As Integer = PictureBox1.Height
        Dim iWidth As Integer = PictureBox1.Width

        '
        ' Open Preview window in picturebox
        '
        hHwnd = capCreateCaptureWindowA(iDevice, WS_VISIBLE Or WS_CHILD, 0, 0, 640, _
            480, PictureBox1.Handle.ToInt32, 0)

        '
        ' Connect to device
        '
        If SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, iDevice, 0) Then
            '
            'Set the preview scale
            '
            SendMessage(hHwnd, WM_CAP_SET_SCALE, True, 0)

            '
            'Set the preview rate in milliseconds
            '
            SendMessage(hHwnd, WM_CAP_SET_PREVIEWRATE, 66, 0)

            '
            'Start previewing the image from the camera
            '
            SendMessage(hHwnd, WM_CAP_SET_PREVIEW, True, 0)

            '
            ' Resize window to fit in picturebox
            '
            SetWindowPos(hHwnd, HWND_BOTTOM, 0, 0, PictureBox1.Width, PictureBox1.Height, _
                    SWP_NOMOVE Or SWP_NOZORDER)

            Button8.Visible = True
            Button9.Visible = True
        Else

            Error connecting to device close window

            DestroyWindow(hHwnd)
            MsgBox("حدث خطأ اثناء الاتصال بالكاميرا , تأكد من توصيلها جيداً بالجهاز", MsgBoxStyle.Exclamation)

        End If


end sub

ظهر لي هذا الخطأ ,,

اقتباس

"Cross-thread operation not valid: Control 'PictureBox1'

مع العلم ان الكود التالي يقوم بفتح المنفذ المتصل بالكاميرا لاظهار صورة الكاميرا في ال picture box

الكود شغال عادي بدون استعامل ال thread ولكن بعد استعمال ال thread ظهر الخطأ التالي ,, هل لي بحل اخواني

منتظركم ..

#2

إطار الدوت نت يحظر الوصول إلى مربعات التحكم التي تم إنشاؤها على مسلك آخر غير المسلك الحالي. لحل المشكلة تحتاج لوضع كود الوصول إلى المربعات داخل دالة ثم المناداة عليها عن طريق Delegate و هذه طريقة تستعمل Reflection للوصول إلى خصائص كائن تم انشاؤه على المسلك الرئيس من مسلك آخر :

أولا, قم بزيادة كود Delegate المناداة على دالة تغيير الخصائص على مستوى الفورم :

    ' تغيير قيمة خاصية من مسلك آخر غير المسلك الرئيسي
    Private Delegate Sub SetPropertyValueDelegate(ByVal obj As Object, ByVal prop As String, ByVal value As Object)

و بعد ذلك قم بزيادة الدالة التالية :

    ' تتم المناداة على الدالة لتغيير محتوى خاصية كائن تم انشاؤه خارج مسلك التحميل
    ' محاولة تغيير قيمة خاصية كائن لا ينتمي إلى مسلك التحميل تؤدي إلى رفع اسثناء
    ' obj : الكائن المراد تغيير قيمة خاصيته
    ' prop : اسم الخاصية المراد تغيير قيمتها
    ' value : القيمة الجديدة للخاصية
    Private Sub SetPropertyValue(ByVal obj As Object, ByVal prop As String, ByVal value As Object)
        ' إذا, حاليا, الكود سيتم تنفيذه خارج المسلك الذي تم انشاء النموذج فيه...
        If Me.InvokeRequired Then
            ' تنفيذ كود الدالة داخل المسلك الذي انشئ فيه النموذج
            Me.Invoke(New SetPropertyValueDelegate(AddressOf SetPropertyValue), New Object() {obj, prop, value})
            ' خروج
            Return
        End If
        ' الوصول إلى نوع الكائن
        Dim t As Type = obj.GetType()
        ' الوصول إلى الخاصية
        Dim p As Reflection.PropertyInfo = t.GetProperty(prop, Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public)
        ' تغيير قيمتها
        p.SetValue(obj, value, Nothing)
    End Sub

بهذه الطريقة يمكنك تغيير خصائص مربعات التحكم من أي مسلك بأمان و دون حصول أي أخطاء. مثال :

SetPropertyValue(PictureBox1, "Image", imageObject)

لا تنسى أن اسم الخاصية المراد تغييرها يكون بين "..." ففي الكود أعلاه نقوم بتغيير الخاصية Image للكائن PictureBox1 إلى القيمة imageObject

بالتوفيق :)

#3

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

        Control.CheckForIllegalCrossThreadCalls = False

إن قلت قال الله قال رسولـه همزوك همز المنكر المتعالي
أو قلت قد قال الصحابة والألـى تبعاً لهم بالقول والأعمال
أو قلت قـال الشافعي وأحمد و أبو حنيفة والإمام الغالي
صدوا عن وحي الإله ودينـه واحتالوا على حرام الله بالإحلال
يا أمةً لعبت بدين نبيها كتلاعب الصبيان في الأوحال
حاشا رسول الله يحكم بالهوى تلك إذاً حكومة الضلال

feed.1.gif

#4
GHOST2010 كتب:

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

        Control.CheckForIllegalCrossThreadCalls = False

و لكن انتبه أن هذه العملية غير آمنة و قد تتسبب في أخطاء في حالة عدم استخدامها بشكل صحيح.

#5

بالامكان ايضاً استخدام ال Background Worker

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#6

بارك الله فيكم جميعاً

وجزاكم خيراً

تم تعديل هذه المشاركة بواسطة dot.net2008 في 10 فبراير 2010 في 08:20

مواضيع مشابهة