تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
بوتن ايقاف BackgroundWorker
#11
ياريت توضح لنا ما الهدف من الكود الخاص بك
اشرح الفكرة بالتفصيل
الرد }}}
تم الشكر بواسطة:
#12
بسم الله وبحمده نبدأ في سرد فكرة البرنامج

 

الشطر الأول من البرنامج

---- بعد الضغط على ايقونة ادراج نرفع ملف تاكست وليكن اسمه ALLWGS الذي يحتوي قائمة كبيرة من الاحداثيات تصل الى ما يعادل 000 150 سطر احداثيات يوجد نسخة منه بالمرفقات

--- بعد رفع الملف ALLWGS يقوم البرنامج بترتيب الاسطر بشكل تصاعدي وهذا على أساس الأربع ارقام في الكود كما هو مبين في الصورة كما يوجد نسخة للملف بعد الترتيب بالمرفقات



الشطر الثاني من البرنامج

---- بعد الضغط على ايقونة مرجع التقسيم نرفع  ملف وليكن اسمه مرجع التقسيم ويحتوي النسق الذي يتم من خلاله تقسيم الملف  ALLWGS المرتب الى أجزاء كل جزء منها يحمل اسم على حسب ملف مرجع التقسيم

صورة توضح بعض الأجزاء من ملف التقسيم



 

ملاحظات

---- يتم تحديد الملفات الجزئية المراد استخراجها مثلا

--- الملف الرئيسي ALLWGS يحتوي على مقدمة  ( header) ينبغي ان تكون في الملفات الجزئية بنفس الوضعية

---- كل جزء لم يكتمل عدد اسطره يتم استخراجه مع الإبلاغ عنه في نهاية العملية في تاكست بوكس

---  اود من الاخوة الكرام الاخذ بالاعتبار سرعة المعالجة واستخراج الملفات الجزئية
الملفات السالفة الذكر موجودة بملف مضغوط على الرابط ادناه



ملاحظة هامة بعد السرد الطويل احب ان انوه ان البرنامج يعمل عندي 100% ولم يتبقى سوء الجزئية المتعلقة ببوتون ايقاف BackgroundWorker
البرنامج مرفق


الملفات المرفقة
.rar   البرنامج مع ملفات العمل.rar (الحجم : 4.33 م ب / التحميلات : 35)
الرد }}}
تم الشكر بواسطة:
#13
لا يصح أن تقرأ الملف و تقوم بعمليات عليه في نفس الوقت
يجب قراءة الملف أولا بايتخدام RealdAllLines مثلا
ثم بعد ذلك ننعامل مع بيانات الملف كمصفوفات
دعني فقط أختبر المدة الزمنية المطلوبة لقراءة الملف كله دفعة واحدة و حاول انت أيضا أت تختبر المدة الزمنية بنفس الاسلوب

نصيحة بسيطة لك و أتمني أن تتقبلها بصدر رجب في المستقبل حاول ان توضح أسئلتك لأن السؤال الواضح بالتبعية يؤدي الي اجابة واضحة

سرال أخير هل بيانات الملف الأصلي الذي يمكن اعتباره علي انه Header File الخاص بمشروعك قد تتغير مستقبلا أم هي ثابتة
لأنه من اللمكن بناء الملف في ذاكرة الكبيوتر و القراءة من ذاكرة الكمبيوتر
والخلاصة هنا أنك مستقبلا تستطيع الاستغناء عن هذا الملف تماما
الرد }}}
تم الشكر بواسطة:
#14
شكرا لك اخي silverlight على مجهودك الرائع معنا احب ان اوضع لك بعض النقاط
 
بخصوص قراءة الملف الاصلي كامل ومن ثم التعامل مع بياناتها اعتقد انه لاتصلح فيحالتي وهذا للسبب الذي تطرقت له وهو المدة المطلوبة لقراءة الملف دفعة واحد الملف كما يظهر لك كبير ويمكن ان يزيد على هذا العدد من الاسطر اعتقد ان الفكرة المطبقة في الكود بالقراءة و التقسيم في نفس الوقت هي الانسب
--- اما بخصوص Header File نعم هو متغير
الذي فهمته من ردك اخي ان ايقاف  BackgroundWorker لا يصلح الا في حالة رفع الملف الاصلي كامل
الرد }}}
تم الشكر بواسطة:
#15
الملف الاصلي و هو ALLWGS
قرائته تستغرق من 40 - 70  مللي ثانية

لكي يتضح لك الأمر قليلا
افتح مشروع عادي و ضع الملف الرئيسي في فهرس المشروع

و اكتب الكود التالي
انا قرات الملف و قرأت Header لوحده و الارقام لوحدها
PHP كود :
Public Class Form1

    Private timeToreadAllFile 
As String ""

 
   Private Sub Form1_Load(sender As ObjectAs EventArgsHandles MyBase.Load

        Dim fpath 
As String ".\ALLWGS.txt"
 
       ' توقيت لمعرفة المدة الزمنية لقراءة الملف كله
        Dim sw As New Stopwatch

        ' 
تشغيل التايمر
        sw
.Start()

 
       ' قراءة الملف الرئيسي
        Dim s = IO.File.ReadAllLines(fpath)
        ' 
إيقاف التايمر
        sw
.Stop()

 
       ' معرفة المدة الزمنية التي استغرقها قراءة الملف
        timeToreadAllFile += sw.ElapsedMilliseconds.ToString
        Dim i As Integer = Integer.Parse(timeToreadAllFile)
        Me.Text = i.ToString


        ' 
مصفوفة رأس الملف فقط
        Dim headeLines 
As String() = New String(6) {}
 
       For i 0 To 6
            headeLines
(i) = s(i)
 
       Next

        
' مصفوفة الارقام فقط
        Dim lines As List(Of String) = New List(Of String)
        For j As Integer = headeLines.Length To s.Length - 1
            lines.Add(s(j))
        Next


    End Sub
End Class 

إنسي BackfroundWorker حاليا

دعنا نتحرك خطوة بخطوة
الرد }}}
تم الشكر بواسطة: rabeh.ram
#16
رائع اخي انا معك في الخطوة الاولى وهي مفهمومة بانتظار الخطوة الثانية
الرد }}}
تم الشكر بواسطة:
#17
كود :
Imports System.Text.RegularExpressions
Imports System.ComponentModel

Public Class Form1

   Dim WithEvents backwork As New BackgroundWorker With {.WorkerSupportsCancellation = True}
   Dim Status As New StatusStrip
   Dim StatusLabel = New ToolStripStatusLabel() With {.Text = "Ready."}
   Dim StatusProgressBar As New ToolStripProgressBar() With {.Style = ProgressBarStyle.Marquee, .Visible = False, .MarqueeAnimationSpeed = 1}

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       Control.CheckForIllegalCrossThreadCalls = False
       Me.Status.Items.Add(StatusProgressBar)
       Me.Status.Items.Add(StatusLabel)
       Me.Controls.Add(Status)
       '----------------------
       Me.TextBox1.ReadOnly = True
       Me.TextBox2.ReadOnly = True

       Me.Button3.Enabled = False

   End Sub

   Dim الملف_الرئيسي As String
   Dim مرجع_التقسيم As String

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Using o As New OpenFileDialog
           o.Filter = "Text files (*.txt)|*.txt"
           If o.ShowDialog = Windows.Forms.DialogResult.OK Then
               الملف_الرئيسي = o.FileName
               TextBox1.Text = IO.Path.GetFileName(o.FileName)
           End If
       End Using
   End Sub

   Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
       Using o As New OpenFileDialog
           o.Filter = "Text files (*.txt)|*.txt"
           If o.ShowDialog = Windows.Forms.DialogResult.OK Then
               مرجع_التقسيم = o.FileName
               TextBox2.Text = IO.Path.GetFileName(o.FileName)

               Me.Button1.Enabled = False
               Me.Button2.Enabled = False
               Me.TextBox1.Enabled = False
               Me.TextBox2.Enabled = False
               Me.TextBox3.Enabled = False
               Me.TextBox4.Enabled = False
               Me.ListBox1.Items.Clear()

               StatusProgressBar.Visible = True

               backwork.RunWorkerAsync()

               Me.Button3.Enabled = True

           End If
       End Using
   End Sub

   Private Sub backwork_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles backwork.DoWork
       Try
           Dim sourceLines() As String = IO.File.ReadAllLines(الملف_الرئيسي)

           ' header ------------------------------
           Me.StatusLabel.Text = "header working..."
           Dim header(7 - 1) As String
           Array.Copy(sourceLines, 0, header, 0, 7)
           Me.StatusLabel.Text = "header completed"

           ' details -----------------------------
           Me.StatusLabel.Text = "details working..."
           Dim details(sourceLines.Count - 7 - 1) As String
           Array.Copy(sourceLines, 7, details, 0, sourceLines.Count - 7)

           For i = 0 To details.Length - 1
               If backwork.CancellationPending Then
                   e.Cancel = True
                   Exit Sub
               End If
               details(i) = details(i).Substring(9, 4) & " - " & details(i)
           Next
           Array.Sort(details)
           For i = 0 To details.Length - 1
               If backwork.CancellationPending Then
                   e.Cancel = True
                   Exit Sub
               End If
               details(i) = details(i).Substring(7)
           Next
           Me.StatusLabel.Text = "header completed"


           'splitfiles ---------------------------------------------
           Dim files() As String = IO.File.ReadAllLines(مرجع_التقسيم)
           For Each f As String In files
               If backwork.CancellationPending Then
                   e.Cancel = True
                   Exit Sub
               End If
               If f.Trim <> "" Then
                   Dim filename As String = f.Substring(0, 8)
                   Me.StatusLabel.Text = filename & " working..."
                   Dim flagStart As Integer = Val(f.Substring(9, 4))
                   Dim flagEnd As Integer = Val(f.Substring(14, 4))
                   Dim flagCount As Integer = Val(f.Substring(19))
                   Dim range = Enumerable.Range(flagStart, flagEnd - flagStart + 1)
                   Dim RegexPattern As String = "^\w(\d{3})\s\d{4}(" & String.Join("|", range) & ")\s.+"

                   Dim ms As MatchCollection = Regex.Matches(String.Join(vbNewLine, details), RegexPattern, RegexOptions.Multiline)
                   Dim resultLines = (From x As Match In ms Select x.Value).ToArray

                   If flagCount <> ms.Count Then
                       ListBox1.Items.Add(filename)
                   End If

                   Dim resultFile As String = String.Empty
                   resultFile &= "date: xxxxxxxxx" & vbNewLine
                   resultFile &= "mois:  xxxxxxxxxx " & vbNewLine
                   resultFile &= "project: xxxxxxxxx" & vbNewLine
                   resultFile &= "observation: xxxxxxxx" & vbNewLine
                   resultFile &= "unti: xxxxxxxxxxxxxxx" & vbNewLine
                   resultFile &= "" & vbNewLine
                   resultFile &= "" & vbNewLine

                   resultFile &= String.Join(vbNewLine, resultLines) & vbNewLine

                   IO.File.WriteAllText(filename & ".txt", resultFile)
                   Me.StatusLabel.Text = filename & " completed"
               End If
           Next

       Catch ex As Exception
           Me.StatusLabel.Text = "Error."
           MsgBox(ex.Message)
       End Try
   End Sub


   Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
       If backwork.IsBusy Then backwork.CancelAsync()
       Me.Button3.Enabled = False
   End Sub

   Private Sub backwork_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles backwork.RunWorkerCompleted
       If e.Cancelled Then
           Me.StatusLabel.Text = "Cancelled."
       Else
           Me.StatusLabel.Text = "Successful."
       End If

       StatusProgressBar.Visible = False

       Me.Button1.Enabled = True
       Me.Button2.Enabled = True
       Me.TextBox1.Enabled = True
       Me.TextBox2.Enabled = True
       Me.TextBox3.Enabled = True
       Me.TextBox4.Enabled = True

       Me.Button3.Enabled = False

   End Sub

End Class
الرد }}}
تم الشكر بواسطة:
#18
شكرا لك اخي [b]WL_2000 جوابك كان فيه الحل دون ان استغني عن فكرة BackgroundWorker [/b]

[b]كم هو جميل ان تكون مشاركتك الاولى في المنتدى وبهذه الدقة في معالجة الاشكال [/b]
[b]كما ارحب بك في منتدنا الرائع والمميز بدلا عن الاخوة الاعضاء [/b]

[b]ام بخصوص فكرتك اخي [b][b]silverlight[/b] و التي بدات في طرحها و المتعلقة بقراءة الملف كامل فانا انتظر الجديد اذا رايت انه يوجد عندك وقت لاستكمالها فرغم ان الاشكال قد حل فانا هنا لاستفادة من جميع افكاركم والتعلم منها[/b][/b]
الرد }}}
تم الشكر بواسطة:



التنقل السريع :


يقوم بقرائة الموضوع: