منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : إستعمال ال Multi Threading
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2 3 4
بعد التركيز في الكود الي كتبته يتضح انك حاولت تستدعي showdialog من خلال ثريد فرعي وهذا صحيح ولكن ايضا هناك شرط ليكون الامر فعالا وهو ان انشاء كائن الفورم نفسه يجب ان يكون في الثريد الفرعي كذلك ، ولذلك الكود الاساسي الذي كتبته لك كان فعالا ..

بالنسبة للمشكلة الي حصلت بسبب السكين وعدم عمله بشكل سليم ، ذلك والله العالم لان الديف اكسبرس لايعمل بشكل مضبوط في الثريدات الفرعية

سأجرب الان شغلة وارجع لك


--

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

ولكن الكود الاولي الذي كتبته لك كان فعالا: 

كود :
Private Sub SurroundingSub()
   Dim th As Thread = New Thread(Sub()
                                     'انشاء كائن الفورم يجب ان يكون هنا
                                     Dim form As Form2 = New Form2()

                                     'اظهار الفورم
                                     form.ShowDialog()
                                 End Sub)
   th.SetApartmentState(ApartmentState.STA)
   th.Start()
End Sub


فيه حل تلويصي اخر وهو جعل الwebbrowser في فورم منفصلة وتقوم بتشغل الفورم بنفس طريقة الكود اعلاه
ولكي لايلحظ المستخدم ان الويب براوزر يشتغل في window منفصلة ، هنا يمكنك اللعب على خصائص الفورم مثل اخفاء الcontrol bars (زر الاغلاق والتكبير والتصغير) ، وايضا تجعل مكان الفورم هذي فوق المكان المخصص للعرض ، واسناد خاصة owner ..

ساعطيك مثالا على ذلك في لحظات ..
إلهي يبارك فيك و لك و يعطيك ما تتمناه بمحبة الله و مرضاته إن شاء الله
تفضل اخوي ، 

في هذا المثال المكتوب بالسي شارب ستجد هناك الفورم الرئيسية (form1) تحاول تشغيل الفورم الفرعية form2 (تشغيل هذه الفورم يحتاج 3 ثواني)

الان عندما نريد ان نضع ويب براوزر لتشغيل صورة متحركة في الفورم1 ستصادفنا مشكلة التهنيق عندما نحاول فتح الفورم2 وذلك بسبب انشغال الثريد

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

يمكنك مراجعة المثال ورؤيته كيف يعمل :
تفضل هذا الكود للفورم1 كاملا محول للفيجوال بيسك
كود :
Public Partial Class Form1
   Inherits Form

   Private webBrowserForm As Form = DirectCast(Nothing, Form)

   Public Sub New()
       InitializeComponent()
       Form1.CheckForIllegalCrossThreadCalls = False
       CreateWebBroser()
   End Sub

   Private Sub CreateWebBroser()
       Dim th As Thread = New Thread(Sub()
                                         'انشاء كائن الفورم يجب ان يكون هنا
                                         webBrowserForm = New Form()
                                         webBrowserForm.StartPosition = FormStartPosition.Manual
                                         webBrowserForm.FormBorderStyle = FormBorderStyle.None
                                         webBrowserForm.ShowInTaskbar = False
                                         CalculateWebBrowserFormLocationAndSize()
                                         webBrowserForm.Owner = Me
                                         webBrowserForm.Controls.Add(New WebBrowser() With {
                                             .Url = New Uri("https://upload.wikimedia.org/wikipedia/commons/2/2c/Rotating_earth_%28large%29.gif"),
                                             .Dock = DockStyle.Fill
                                         })

                                         'اظهار الفورم
                                         Application.Run(webBrowserForm)
                                     End Sub)
       th.SetApartmentState(ApartmentState.STA)
       th.IsBackground = True
       th.Start()
   End Sub

   Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs)
       Call New Form2().ShowDialog()
   End Sub

   Private Sub Form1_LocationChanged(ByVal sender As Object, ByVal e As EventArgs)
       CalculateWebBrowserFormLocationAndSize()
   End Sub

   Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As EventArgs)
       CalculateWebBrowserFormLocationAndSize()
   End Sub


   Private Sub CalculateWebBrowserFormLocationAndSize()
       If webBrowserForm Is Nothing Then Return

       If webBrowserForm.InvokeRequired Then
           webBrowserForm.Invoke(New Action(AddressOf CalculateWebBrowserFormLocationAndSize))
       Else
           webBrowserForm.Location = PointToScreen(panel1.Location)
           webBrowserForm.Size = panel1.Size
       End If
   End Sub
End Class
تمت الاستعانة ب panel1 هو بانل فاضي مهمته يكون الplaceholder للمكان المفترض يطلع فيه الفورم الي فيه الويب براوزرد


المثال علمته على السريع لذلك لك حرية التصرف في عمل تحسينات له
..
موفقين 
السّلام عليكم و رحمة الله و بركاته
بارك الله فيك أستاذنا الفاضل الشاكي لله و في كل السادة الأساتذة المحترمين الذين قدّموا العون من قريب أو من بعيد
سأحاول تجميع كل هذه الأفكار النيّرة بمشروع واحد و أضعه للإستغادة
تقبلوا كامل إحترامي و امتناني و عرفاني بجميلكم و جميل أعمالكم
تحياتي للجميع
السلام عليكم
هل جربت العمل بـ BuckgroundWorker ؟
(18-10-20, 10:19 PM)larbihamri كتب : [ -> ]السلام عليكم
هل جربت العمل بـ BuckgroundWorker ؟

لم أجرب هذه الطريقة أخي العربي

أكون لك جد شاكر لو تعمل مثال بسيط حول فتح فورم بهاته الطريقة للتعلّم

بارك الله فيك و لك و جزاك خير الجزاء مقدما

تحياتي
(19-10-20, 02:05 AM)عبد العزيز البسكري كتب : [ -> ]
(18-10-20, 10:19 PM)larbihamri كتب : [ -> ]السلام عليكم
هل جربت العمل بـ BuckgroundWorker ؟

لم أجرب هذه الطريقة أخي العربي

أكون لك جد شاكر لو تعمل مثال بسيط حول فتح فورم بهاته الطريقة للتعلّم

بارك الله فيك و لك و جزاك خير الجزاء مقدما

تحياتي



هذا شرح شامل خفيف لها أخى عبد العزيز


الصفحات : 1 2 3 4