If ListBox3.Items.Count < 1 Then Start1.Stop() ProgressBar1.Value = False Me.emad1.Send(String.Concat(New String() {"<presence to='" + room.Text + "@conference.nimbuzz.com/imanking' type='unavailable'></presence>"})) Exit Sub End If
(27-07-17, 08:17 PM)silverlight كتب : يا أخ عماد او يا أخ e-coder
انت ما زلت ف نفس المشكلة بلا حل؟؟؟؟!!!!
ربما لأن أغلب الناس مش فاهمة قوي ماذا تفعل بهذا الكود
وللأسف انا لم يعد يصبر مثل زمان إني ادرس كود كتبه شخص أخر
حاول توضح لنا الكود من فضلك ......
اخي في التايمر يوجد كود ولكن المشكلة هي كالتالي :
اذا كان العدد في listbox قليل بشتغل الكود
يعني مثال : اذا كان في listox الايميلات التالية
emad
emad2
emad3
بشتغل الكود وتمام التمام ولكن المشكلة هي كالتالي
اذا كان في listbox1
emad1
emad2
emad3
emad4
emad5
emad6
emad7
emad8
emad9
emad10
emad11
emad12
emad...20
لا يعمل الكود
Catch ex As Exception End Try If ListBox1.Items.Count < 1 Then Start1.Stop() ProgressBar1.Value = False Me.emad1.Send(String.Concat(New String() {"<presence to='" + room.Text + "@conference.nimbuzz.com/imanking' type='unavailable'></presence>"})) Exit Sub End If End Sub
كود تشغيل التايمر
PHP كود :
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Try ProgressBar1.Maximum = ListBox1.Items.Count Start1.Start() Catch ex As Exception
28-07-17, 01:14 AM (آخر تعديل لهذه المشاركة : 28-07-17, 01:48 AM {2} بواسطة ابو ليلى.)
السلام عليكم و رحمة الله اخي الكريم ابتعد عن استخدام التايمر و استخدم التقنيات الجديدة افضل لك و احرص على ان تكون الاجراءات الخاصة بك من النوع غير المتزامن (اذا كان العدد الذي تريد ارساله كبير) حتى تتحاشى مشاكل التجميد في البرنامج كمثال بسيط لك ضع ListBox و TextBox و Button و Progresspar ثم جرب هذا الكود و انتبه لسلاسة سير العملية باستخدام Async Wait Task كود النموذج كامل
PHP كود :
Public Class Form4 Private Sub Form4_Load(sender As Object, e As EventArgs) Handles MyBase.Load For i = 1 To 100 ListBox1.Items.Add("emad" & i) Next End Sub
Private Async Sub BtnSend_Click(sender As Object, e As EventArgs) Handles BtnSend.Click TextBox1.Clear() If ListBox1.Items.Count > 0 Then ProgressBar1.Maximum = ListBox1.Items.Count - 1 For x As Integer = 0 To ListBox1.Items.Count - 1 Await (send(0)) ListBox1.Items.RemoveAt(0) ListBox1.Refresh() ProgressBar1.Value = x 'هذا الكود لاظهار التقدم بالنسبة المئوية Dim percent As Integer = CInt((CDbl(ProgressBar1.Value - ProgressBar1.Minimum) / CDbl(ProgressBar1.Maximum - ProgressBar1.Minimum)) * 100) Using gr As Graphics = ProgressBar1.CreateGraphics() gr.DrawString(percent.ToString() + "%", SystemFonts.DefaultFont, Brushes.Black, New PointF(ProgressBar1.Width / 2 - (gr.MeasureString(percent.ToString() + "%", SystemFonts.DefaultFont).Width / 2.0F), ProgressBar1.Height / 2 - (gr.MeasureString(percent.ToString() + "%", SystemFonts.DefaultFont).Height / 2.0F))) End Using Next BtnSend.Enabled = True
Else TextBox1.Text = "<presence to='" & Mystruct.room & "@conference.nimbuzz.com/imanking' type='unavailable'></presence>" ProgressBar1.Value = 0 End If
End Sub
Private Async Function send(i As Integer) As Task Dim Sb As New List(Of String) Sb.Clear() Dim t As Task = Me.Invoke(Sub() BtnSend.Enabled = False Dim Str As String() = {"<message xmlns='jabber:client' to='", Mystruct.room _ , "@conference.nimbuzz.com/", ListBox1.Items(i).ToString, vbNewLine, "'type='chat' id='292'>", vbNewLine, "<body>", vbNewLine, Mystruct.mspv1 & vbNewLine & Mystruct.mspv2 & vbNewLine & Mystruct.mspv3 & vbNewLine & Mystruct.mspv4 & vbNewLine & Mystruct.mspv5, vbNewLine & "</body>", vbNewLine, "<html xmlns='http://jabber.org/protocol/xhtml-im'>", vbNewLine, "<body xmlns='http://www.w3.org/1999/xhtml'>", vbNewLine, "<p>", vbNewLine, "<em>", vbNewLine, "false", vbNewLine, "</em>", vbNewLine, "<strong>", vbNewLine, "true", vbNewLine, "</strong>", vbNewLine, "<span style='" & Mystruct.colors & "'/>", vbNewLine, "</p>", vbNewLine, "</body>", vbNewLine, "</html>", vbNewLine, "</message>", vbNewLine, "***********************************"}
Sb.Add(String.Concat(Str))
For Each Instr As String In Sb TextBox1.AppendText(Instr & Environment.NewLine) Next
End Sub) Await Task.Delay(100)
End Function End Class
حدد المدة التي تريدها فاصل بين كل ارسال في الخاصية Await Task.Delay
(28-07-17, 01:14 AM)ابو ليلى كتب : السلام عليكم و رحمة الله اخي الكريم ابتعد عن استخدام التايمر و استخدم التقنيات الجديدة افضل لك و احرص على ان تكون الاجراءات الخاصة بك من النوع غير المتزامن (اذا كان العدد الذي تريد ارساله كبير) حتى تتحاشى مشاكل التجميد في البرنامج كمثال بسيط لك ضع ListBox و TextBox و Button و Progresspar ثم جرب هذا الكود و انتبه لسلاسة سير العملية باستخدام Async Wait Task كود النموذج كامل
PHP كود :
Public Class Form4 Private Sub Form4_Load(sender As Object, e As EventArgs) Handles MyBase.Load For i = 1 To 100 ListBox1.Items.Add("emad" & i) Next End Sub
Private Async Sub BtnSend_Click(sender As Object, e As EventArgs) Handles BtnSend.Click TextBox1.Clear() If ListBox1.Items.Count > 0 Then ProgressBar1.Maximum = ListBox1.Items.Count - 1 For x As Integer = 0 To ListBox1.Items.Count - 1 Await (send(0)) ListBox1.Items.RemoveAt(0) ListBox1.Refresh() ProgressBar1.Value = x 'هذا الكود لاظهار التقدم بالنسبة المئوية Dim percent As Integer = CInt((CDbl(ProgressBar1.Value - ProgressBar1.Minimum) / CDbl(ProgressBar1.Maximum - ProgressBar1.Minimum)) * 100) Using gr As Graphics = ProgressBar1.CreateGraphics() gr.DrawString(percent.ToString() + "%", SystemFonts.DefaultFont, Brushes.Black, New PointF(ProgressBar1.Width / 2 - (gr.MeasureString(percent.ToString() + "%", SystemFonts.DefaultFont).Width / 2.0F), ProgressBar1.Height / 2 - (gr.MeasureString(percent.ToString() + "%", SystemFonts.DefaultFont).Height / 2.0F))) End Using Next BtnSend.Enabled = True
Else TextBox1.Text = "<presence to='" & Mystruct.room & "@conference.nimbuzz.com/imanking' type='unavailable'></presence>" ProgressBar1.Value = 0 End If
End Sub
Private Async Function send(i As Integer) As Task Dim Sb As New List(Of String) Sb.Clear() Dim t As Task = Me.Invoke(Sub() BtnSend.Enabled = False Dim Str As String() = {"<message xmlns='jabber:client' to='", Mystruct.room _ , "@conference.nimbuzz.com/", ListBox1.Items(i).ToString, vbNewLine, "'type='chat' id='292'>", vbNewLine, "<body>", vbNewLine, Mystruct.mspv1 & vbNewLine & Mystruct.mspv2 & vbNewLine & Mystruct.mspv3 & vbNewLine & Mystruct.mspv4 & vbNewLine & Mystruct.mspv5, vbNewLine & "</body>", vbNewLine, "<html xmlns='http://jabber.org/protocol/xhtml-im'>", vbNewLine, "<body xmlns='http://www.w3.org/1999/xhtml'>", vbNewLine, "<p>", vbNewLine, "<em>", vbNewLine, "false", vbNewLine, "</em>", vbNewLine, "<strong>", vbNewLine, "true", vbNewLine, "</strong>", vbNewLine, "<span style='" & Mystruct.colors & "'/>", vbNewLine, "</p>", vbNewLine, "</body>", vbNewLine, "</html>", vbNewLine, "</message>", vbNewLine, "***********************************"}
Sb.Add(String.Concat(Str))
For Each Instr As String In Sb TextBox1.AppendText(Instr & Environment.NewLine) Next
End Sub) Await Task.Delay(100)
End Function End Class
حدد المدة التي تريدها فاصل بين كل ارسال في الخاصية Await Task.Delay
بالتوفيق
اخي انا عملت نموذج قبل لطبقو ع برنامج ولكن ظهرت اخطاء الرجاء تحميل المشرةع من مرفقات وتعديل عليه لكي اطبقة ع برنامجي
وشكرا لك
السلام عليكم و رحمة الله و بركاته في ما يبدو انك تستخدم VS 2010 , نسخة اطار العمل 4.0 , و انا اعمل مع النسخة 4.5 و للاسف النسخة 4.0 لا تدعم العمليات غير المتزامنة عبر Async Wait لذلك اخي الكريم حاول ان تعتمد على Thread لتلبي طلبك.
عدل كود النموذج لديك كالتالي
PHP كود :
Imports System.Threading Public Class Form1 Dim Th As Thread = Nothing
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For i = 1 To 100 ListBox1.Items.Add("emad" & i) Next End Sub
Private Sub BtnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSend.Click
TextBox1.Clear() BtnSend.Enabled = False
If ListBox1.Items.Count > 0 Then ProgressBar1.Maximum = ListBox1.Items.Count - 1 Th = New Thread(Sub() For x As Integer = 0 To ListBox1.Items.Count - 1 Thread.Sleep(100) send(0, x) Next End Sub) Th.IsBackground = True Th.Start()
Else TextBox1.Text = "<presence to='" & Mystruct.room & "@conference.nimbuzz.com/imanking' type='unavailable'></presence>" ProgressBar1.Value = 0 BtnSend.Enabled = True End If
End Sub
Private Sub send(i As Integer, x As Integer) Dim Sb As New List(Of String) Sb.Clear() Me.BeginInvoke(Sub() If Not Th.IsAlive Then BtnSend.Enabled = True End If
(29-07-17, 02:17 AM)ابو ليلى كتب : السلام عليكم و رحمة الله و بركاته في ما يبدو انك تستخدم VS 2010 , نسخة اطار العمل 4.0 , و انا اعمل مع النسخة 4.5 و للاسف النسخة 4.0 لا تدعم العمليات غير المتزامنة عبر Async Wait لذلك اخي الكريم حاول ان تعتمد على Thread لتلبي طلبك.
عدل كود النموذج لديك كالتالي
PHP كود :
Imports System.Threading Public Class Form1 Dim Th As Thread = Nothing
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For i = 1 To 100 ListBox1.Items.Add("emad" & i) Next End Sub
Private Sub BtnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSend.Click
TextBox1.Clear() BtnSend.Enabled = False
If ListBox1.Items.Count > 0 Then ProgressBar1.Maximum = ListBox1.Items.Count - 1 Th = New Thread(Sub() For x As Integer = 0 To ListBox1.Items.Count - 1 Thread.Sleep(100) send(0, x) Next End Sub) Th.IsBackground = True Th.Start()
Else TextBox1.Text = "<presence to='" & Mystruct.room & "@conference.nimbuzz.com/imanking' type='unavailable'></presence>" ProgressBar1.Value = 0 BtnSend.Enabled = True End If
End Sub
Private Sub send(i As Integer, x As Integer) Dim Sb As New List(Of String) Sb.Clear() Me.BeginInvoke(Sub() If Not Th.IsAlive Then BtnSend.Enabled = True End If
السلام عليكم و رحمة الله و بركاته الاخ عماد ... انت طرحت مشكلة محددة وهي عدم القدرة على التعامل مع عدد كبير من العناصر في قائمة ListBox و كل عنصر منها يحتاج الى تمرير دالة سميناها جدلاً Send و انا رايت ان اختار دالة تقوم بتمرير نص محدد (النص الذي لديك في الكود) يتم تمرير هذا النص الى مربع نص على الفورم لكل عنصر في القائمة (و ليس الى سيرفر كما لديك) و اما السؤال عن كلمة emad في الكود فليس له وجود عندي لانني لا اتعامل مع مكتبتك (شيئ طبيعي لاني لا املكها و لم اتعامل معها). المفروض عليك انت تستفيد من جوهر الكود و طريقة عمله و توظفه لديك بما يناسب الدالة الخاصة بكائن الاتصال الخاص لديك. اما مسالة ان اعدل لك على كم كبير من الاكواد فهذا ما لا استطيعه . وفق نظرة على الكود لديك ....... بعض النصائح ؟؟ انت تعيد كتابة نفس الكود في الكثير من الاجراءات مع تغير بسيط غالباً في اسم Lable او اسم اخر . النصيحة لك ان تعمم كود الارسال و تجعله في دالة منفصلة او كلاس او اي شيئ اخر و تقوم باستدعائه مع تغير ما يلزم فقط. لم اطلع على كامل الكود فقط كانت نظرة ..