Results 1 to 22 of 22

Thread: [2008] Multithreading

  1. #1

    Thread Starter
    Hyperactive Member
    Join Date
    Jun 2008
    Location
    Nowhere
    Posts
    427

    [2008] Multithreading

    I have a code here to download a list of files (Same one i posted in CodeBank) but i currently use it to download huge files but it freezes and im thinking i should move it to a backgroundworker, and i want to know how would i report the progress accurately and same way i do here while multithreading?
    vb.net Code:
    1. Imports System.IO
    2. Imports System.Net
    3. Imports Microsoft.VisualBasic.FileIO.FileSystem
    4.  
    5. Public Class Form1
    6.     Private Const sfilename As String = "c:\Users\Home\Desktop\list_of_files.txt"
    7.     Private Const url As String = "http://www.hotlinkfiles.com/files"
    8.     Private Const spath As String = "c:\Users\Home\Desktop\test"
    9.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    10.         'CHECK FOR LIST
    11.         If Not My.Computer.FileSystem.FileExists(sfilename) Then
    12.             MsgBox("No list found, exiting application", MsgBoxStyle.Critical)
    13.             Exit Sub
    14.             Application.Exit()
    15.         End If
    16.         Dim sr As New IO.StreamReader(sfilename)
    17.         Dim line As String = sr.ReadLine()
    18.         Dim req As Net.WebRequest
    19.         Dim resp As IO.Stream
    20.         Dim out As IO.BinaryWriter
    21.         Do While line IsNot Nothing
    22.             req = Net.HttpWebRequest.Create(url & line)
    23.             Dim progmax As Net.HttpWebResponse = req.GetResponse()
    24.             resp = req.GetResponse().GetResponseStream()
    25.             '===========================
    26.             'CREATES DIRECTORY IF NEEDED BEFORE IT CALLS TO OPEN A NEW FILESTREAM AND THERE IS NONE
    27.             '===========================
    28.             Dim filepath As String = spath & line
    29.             If Not Directory.Exists(filepath.Replace(Path.GetFileName(filepath), String.Empty)) Then Directory.CreateDirectory(filepath.Replace(Path.GetFileName(filepath), String.Empty))
    30.             '===========================
    31.             out = New IO.BinaryWriter(New IO.FileStream(spath & line, IO.FileMode.OpenOrCreate))
    32.             Dim buf(4096) As Byte
    33.             Dim k As Int32 = resp.Read(buf, 0, 4096)
    34.             Do While k > 0
    35.                 out.Write(buf, 0, k)
    36.                 k = resp.Read(buf, 0, 4096)
    37.                 '===================
    38.                 'READ FROM THE BUFFER AND REPORT PROGRESS TO THE PROGBAR
    39.                 '===================
    40.                 Progbar.Maximum = progmax.ContentLength
    41.                 If Progbar.Value + k <= Progbar.Maximum Then
    42.                     Progbar.Value += k
    43.                 Else
    44.                     Progbar.Value = Progbar.Maximum
    45.                 End If
    46.             Loop
    47.  
    48.             resp.Close()
    49.             out.Close()
    50.             line = sr.ReadLine()
    51.         Loop
    52.     End Sub
    53. End Class
    "Programming is like sex. One mistake and you have to support it for the rest of your life." ~Michael Sinz


    Code Snippets/Usefull Links:
    WinRAR DLL|Vista Style Form|Krypton Component Library|Windows Form Aero|Parsing XML files|Calculate File's CRC 32|Download a list of files.

  2. #2
    Hyperactive Member
    Join Date
    Apr 2005
    Location
    Indiana
    Posts
    451

    Re: [2008] Multithreading

    You would use a delegate to trigger the update of the progres bar.

    This article might help.

    http://www.developer.com/net/net/article.php/3555551
    Ben


    Using Visual Basic 2005/2008

  3. #3

    Thread Starter
    Hyperactive Member
    Join Date
    Jun 2008
    Location
    Nowhere
    Posts
    427

    Re: [2008] Multithreading

    I know i would use a delegate but im trying to find out how exactly im going to run this information correctly through a background worker.
    vb Code:
    1. If Progbar.Value + k <= Progbar.Maximum Then
    2.                     Progbar.Value += k
    3.                 Else
    4.                     Progbar.Value = Progbar.Maximum
    5.                 End If

    In that code it all runs on one thread and all the calculation for the progress is done there also so im trying to figure out how to multithread but have the same information being passed around.
    "Programming is like sex. One mistake and you have to support it for the rest of your life." ~Michael Sinz


    Code Snippets/Usefull Links:
    WinRAR DLL|Vista Style Form|Krypton Component Library|Windows Form Aero|Parsing XML files|Calculate File's CRC 32|Download a list of files.

  4. #4
    Super Moderator jmcilhinney's Avatar
    Join Date
    May 2005
    Location
    Sydney, Australia
    Posts
    110,344

    Re: [2008] Multithreading

    What you're asking for is the primary reason for the backgroundWorker's existence. The class has a ReportProgress method and a ProgressChanged event specifically for the purpose. You calculate the current progress on the worker thread and then call ReportProgress. That raises the ProgressChanged event on the UI thread so you can update a ProgressBar in the event handler. Follow the BackgroundWorker link in my signature for an example.

  5. #5

    Thread Starter
    Hyperactive Member
    Join Date
    Jun 2008
    Location
    Nowhere
    Posts
    427

    Re: [2008] Multithreading

    How would i pass the maximum progressbar amount using the backgroundworker jmcilhinney? I looked at your example but it doesnt declare a progressbar.maximum as it seems ur using the default 100.
    "Programming is like sex. One mistake and you have to support it for the rest of your life." ~Michael Sinz


    Code Snippets/Usefull Links:
    WinRAR DLL|Vista Style Form|Krypton Component Library|Windows Form Aero|Parsing XML files|Calculate File's CRC 32|Download a list of files.

  6. #6
    Super Moderator jmcilhinney's Avatar
    Join Date
    May 2005
    Location
    Sydney, Australia
    Posts
    110,344

    Re: [2008] Multithreading

    Quote Originally Posted by youngbucks
    How would i pass the maximum progressbar amount using the backgroundworker jmcilhinney? I looked at your example but it doesnt declare a progressbar.maximum as it seems ur using the default 100.
    You really don't need to. Just use 100 as the maximum and calculate the current progress as a percentage. If you really want to use an absolute maximum then you can pass that to the second parameter of ReportProgress.

  7. #7

    Thread Starter
    Hyperactive Member
    Join Date
    Jun 2008
    Location
    Nowhere
    Posts
    427

    Re: [2008] Multithreading

    Whats the second parameter? This?
    vb Code:
    1. BackgroundWorker1.ReportProgress(k, progressbarmaximum)
    "Programming is like sex. One mistake and you have to support it for the rest of your life." ~Michael Sinz


    Code Snippets/Usefull Links:
    WinRAR DLL|Vista Style Form|Krypton Component Library|Windows Form Aero|Parsing XML files|Calculate File's CRC 32|Download a list of files.

  8. #8
    Super Moderator jmcilhinney's Avatar
    Join Date
    May 2005
    Location
    Sydney, Australia
    Posts
    110,344

    Re: [2008] Multithreading

    Have you read the MSDN documentation for the ReportProgress method and the ProgressChanged event?

  9. #9

    Thread Starter
    Hyperactive Member
    Join Date
    Jun 2008
    Location
    Nowhere
    Posts
    427

    Re: [2008] Multithreading

    I just did and mustve overlooked because i found nothing about second parameter. When i read the ReportProgress it talkes about reporting the progress as an integer and userstate as a string. As for the progresschanged only about rasing the event of progress changed.
    "Programming is like sex. One mistake and you have to support it for the rest of your life." ~Michael Sinz


    Code Snippets/Usefull Links:
    WinRAR DLL|Vista Style Form|Krypton Component Library|Windows Form Aero|Parsing XML files|Calculate File's CRC 32|Download a list of files.

  10. #10
    Super Moderator jmcilhinney's Avatar
    Join Date
    May 2005
    Location
    Sydney, Australia
    Posts
    110,344

    Re: [2008] Multithreading

    The second parameter can be anything you want. It is type Object specifically for that purpose. You may have seen an example that passes a String but that's just an example. If you want to pass an Integer containing the maximum progress then that's exactly what you pass. If you want to pass a ListViewItem that was created from the field values of a DataRow then that's exactly what you pass. Etc., etc.

  11. #11

    Thread Starter
    Hyperactive Member
    Join Date
    Jun 2008
    Location
    Nowhere
    Posts
    427

    Re: [2008] Multithreading

    How would i pass a integer as it though? I tried this and it doent work so how?
    vb Code:
    1. Copyingbackgroundworker.ReportProgress(k, 100)

    And

    vb Code:
    1. ProgressBar1.Maximum = TryCast(e.UserState, Integer)
    "Programming is like sex. One mistake and you have to support it for the rest of your life." ~Michael Sinz


    Code Snippets/Usefull Links:
    WinRAR DLL|Vista Style Form|Krypton Component Library|Windows Form Aero|Parsing XML files|Calculate File's CRC 32|Download a list of files.

  12. #12
    Super Moderator jmcilhinney's Avatar
    Join Date
    May 2005
    Location
    Sydney, Australia
    Posts
    110,344

    Re: [2008] Multithreading

    Um, yes it does work. That code isn't going to make any change though because you're setting the Maximum to 100, which is the same value it already is. Try this:

    1. Create a new WinForms project.
    2. Add two Buttons, a ProgressBar and a BackgroundWorker.
    3. Set the BGW's WorkerReportsProgress property to True.
    4. Add this code:
    Code:
    Private Sub Button1_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) Handles Button1.Click
        MessageBox.Show(Me.ProgressBar1.Maximum.ToString())
    End Sub
    
    Private Sub Button2_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) Handles Button2.Click
        Me.BackgroundWorker1.RunWorkerAsync()
    End Sub
    
    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, _
                                         ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Me.BackgroundWorker1.ReportProgress(0, 999)
    End Sub
    
    Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, _
                                                  ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        Me.ProgressBar1.Maximum = CInt(e.UserState)
    End Sub
    5. Run the project.
    6. Click Button1 and observe the value.
    7. Click Button2.
    8. Click Button1 again and observe the value.

    Tada!

  13. #13

    Thread Starter
    Hyperactive Member
    Join Date
    Jun 2008
    Location
    Nowhere
    Posts
    427

    Re: [2008] Multithreading

    I got that to work here but im having another problem, i get to change the max value but its changed too late so the actual progress seen is never more that 1%.

    vb Code:
    1. Imports System.IO
    2. Imports System.Net
    3. Imports Microsoft.VisualBasic.FileIO.FileSystem
    4.  
    5. Public Class Form1
    6.     Private Const sfilename As String = "c:\Users\Home\Desktop\list_of_files.txt"
    7.     Private Const url As String = "http://www.hotlinkfiles.com/files"
    8.     Private Const spath As String = "c:\Users\Home\Desktop\test"
    9.  
    10.     Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    11.         Try
    12.             'CHECK FOR LIST
    13.             If Not My.Computer.FileSystem.FileExists(sfilename) Then
    14.                 MsgBox("No list found, exiting application", MsgBoxStyle.Critical)
    15.                 Exit Sub
    16.                 Application.Exit()
    17.             End If
    18.             Dim sr As New IO.StreamReader(sfilename)
    19.             Dim line As String = sr.ReadLine()
    20.             Dim req As Net.WebRequest
    21.             Dim resp As IO.Stream
    22.             Dim out As IO.BinaryWriter
    23.             Do While line IsNot Nothing
    24.                 req = Net.HttpWebRequest.Create(url & line)
    25.                 Dim progmax As Net.HttpWebResponse = req.GetResponse()
    26.                 resp = req.GetResponse().GetResponseStream()
    27.                 '===========================
    28.                 'CREATES DIRECTORY IF NEEDED BEFORE IT CALLS TO OPEN A NEW FILESTREAM AND THERE IS NONE
    29.                 '===========================
    30.                 Dim filepath As String = spath & line
    31.                 If Not Directory.Exists(filepath.Replace(Path.GetFileName(filepath), String.Empty)) Then Directory.CreateDirectory(filepath.Replace(Path.GetFileName(filepath), String.Empty))
    32.                 '===========================
    33.                 out = New IO.BinaryWriter(New IO.FileStream(spath & line, IO.FileMode.OpenOrCreate))
    34.                 Dim buf(4096) As Byte
    35.                 Dim k As Int32 = resp.Read(buf, 0, 4096)
    36.                 Do While k > 0
    37.                     out.Write(buf, 0, k)
    38.                     k = resp.Read(buf, 0, 4096)
    39.                     '===================
    40.                     'READ FROM THE BUFFER AND REPORT PROGRESS TO THE PROGBAR
    41.                     '===================
    42.                     Dim max As Integer = progmax.ContentLength
    43.                     'ProgBar.Maximum = progmax.ContentLength
    44.                     'If ProgBar.Value + k <= ProgBar.Maximum Then
    45.                     BackgroundWorker1.ReportProgress(k + k, max)
    46.                     'ProgBar.Value += k
    47.                     'Else
    48.                     'BackgroundWorker1.ReportProgress(max, max)
    49.                     ' ProgBar.Value = ProgBar.Maximum
    50.                     'End If
    51.                 Loop
    52.  
    53.                 resp.Close()
    54.                 out.Close()
    55.                 line = sr.ReadLine()
    56.             Loop
    57.         Catch ex As Exception
    58.             MsgBox(ex.ToString)
    59.             Exit Sub
    60.         End Try
    61.     End Sub
    62.  
    63.     Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    64.         Try
    65.             Me.ProgBar.Maximum = CInt(e.UserState)
    66.             ProgBar.Value = e.ProgressPercentage
    67.         Catch ex As Exception
    68.             MsgBox(ex.ToString)
    69.         End Try
    70.     End Sub
    71.  
    72.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    73.         BackgroundWorker1.RunWorkerAsync()
    74.     End Sub
    75. End Class
    "Programming is like sex. One mistake and you have to support it for the rest of your life." ~Michael Sinz


    Code Snippets/Usefull Links:
    WinRAR DLL|Vista Style Form|Krypton Component Library|Windows Form Aero|Parsing XML files|Calculate File's CRC 32|Download a list of files.

  14. #14
    Super Moderator jmcilhinney's Avatar
    Join Date
    May 2005
    Location
    Sydney, Australia
    Posts
    110,344

    Re: [2008] Multithreading

    Why do you have exception handling in your ProgressChanged event handler? What possible exception could you be handling? You only add exception handling when an exception can reasonably be thrown, which it can't in that case.

    Why do you need to get the maximum progress each time through the loop? Once it's set is it ever going to change? No it's not, so you only need to set it once.

    Try calling Refresh on your ProgressBar in the ProgressChanged event handler to force it to repaint.

  15. #15

    Thread Starter
    Hyperactive Member
    Join Date
    Jun 2008
    Location
    Nowhere
    Posts
    427

    Re: [2008] Multithreading

    Refresh doesnt seem to help at all and i put "BackgroundWorker1.ReportProgress(k + k, max)" to report progress as ive seen in your example so i am unaware of any other way to set the progressbar maximum than as u have seen.
    "Programming is like sex. One mistake and you have to support it for the rest of your life." ~Michael Sinz


    Code Snippets/Usefull Links:
    WinRAR DLL|Vista Style Form|Krypton Component Library|Windows Form Aero|Parsing XML files|Calculate File's CRC 32|Download a list of files.

  16. #16
    Super Moderator jmcilhinney's Avatar
    Join Date
    May 2005
    Location
    Sydney, Australia
    Posts
    110,344

    Re: [2008] Multithreading

    Think outside the box. The only way to get information to the ProgressChanged event handler is to call ReportProgress but who says you have to pass the maximum value every time?
    vb.net Code:
    1. Public Class Form1
    2.  
    3.     Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, _
    4.                                          ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    5.         Me.BackgroundWorker1.ReportProgress(0, 999)
    6.  
    7.         For i As Integer = 1 To 999
    8.             Me.BackgroundWorker1.ReportProgress(i)
    9.         Next
    10.     End Sub
    11.  
    12.     Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, _
    13.                                                   ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    14.         If e.UserState Is Nothing Then
    15.             Me.ProgressBar1.Value = e.ProgressPercentage
    16.         Else
    17.             Me.ProgressBar1.Maximum = CInt(e.UserState)
    18.         End If
    19.  
    20.         Me.ProgressBar1.Refresh()
    21.     End Sub
    22.  
    23.     Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    24.         Me.BackgroundWorker1.RunWorkerAsync()
    25.     End Sub
    26.  
    27. End Class

  17. #17

    Thread Starter
    Hyperactive Member
    Join Date
    Jun 2008
    Location
    Nowhere
    Posts
    427

    Re: [2008] Multithreading

    I fixed my code to match what you have up there but now when i run it the form hampers drastically, it freezes majority of the time and 1/10 it unfreezes and you see a big chunk of the progress change so i cant keep up to see if its reporting the progress properly. Adding Me.Refresh and ProgressBar1.Refresh does nothing. Could it be that the values im working with are too big?
    "Programming is like sex. One mistake and you have to support it for the rest of your life." ~Michael Sinz


    Code Snippets/Usefull Links:
    WinRAR DLL|Vista Style Form|Krypton Component Library|Windows Form Aero|Parsing XML files|Calculate File's CRC 32|Download a list of files.

  18. #18
    Super Moderator jmcilhinney's Avatar
    Join Date
    May 2005
    Location
    Sydney, Australia
    Posts
    110,344

    Re: [2008] Multithreading

    This is what debugging is for. Add some code that will output the time just before calling ReportProgress, then watch the Output window to see whether what you see there matches what you see in the UI. If you want to know if your chunks are too big then test with smaller chunks. Do what you can for yourself first because we can only do so much without seeing the code in action.

  19. #19

    Thread Starter
    Hyperactive Member
    Join Date
    Jun 2008
    Location
    Nowhere
    Posts
    427

    Re: [2008] Multithreading

    Question, how come when i use kleinma's downloader it doesnt freeze when i set it to download huge files? Is it cuz its a class? Im thinking of modifying it to work like i have up top but without the lag.
    "Programming is like sex. One mistake and you have to support it for the rest of your life." ~Michael Sinz


    Code Snippets/Usefull Links:
    WinRAR DLL|Vista Style Form|Krypton Component Library|Windows Form Aero|Parsing XML files|Calculate File's CRC 32|Download a list of files.

  20. #20

    Thread Starter
    Hyperactive Member
    Join Date
    Jun 2008
    Location
    Nowhere
    Posts
    427

    Re: [2008] Multithreading

    I used kleinma's webfiledownloader class and modified it to download the list of files without a backgroundworker and it downloads huge files one after each other without any lag or delay. Why did mine lag and this one didnt? :S

    This is the code i currently use.
    vb Code:
    1. Imports System.IO
    2.  
    3. Public Class form1
    4.     Private Processcompletion As Boolean = True
    5.     Private Const url As String = "http://www.hotlinkfiles.com/files"
    6.     Private Const txtdownloadto As String = "C:\Users\Home\Desktop\test"
    7.     Private SR As New IO.StreamReader("C:\users\Home\Desktop\list_of_files.txt")
    8.     Private WithEvents _Downloader As WebFileDownloader
    9.     Private Sub cmdDownload_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdDownload.Click
    10.         Dim currentline As String = SR.ReadLine()
    11.         Do While currentline IsNot Nothing
    12.             Try
    13.                 If Not Processcompletion = True Then Application.Exit()
    14.                 Dim filepath As String = txtdownloadto & currentline
    15.                 If Not Directory.Exists(filepath.Replace(Path.GetFileName(filepath), String.Empty)) Then Directory.CreateDirectory(filepath.Replace(Path.GetFileName(filepath), String.Empty))
    16.                 Dim newurl As String = url & currentline.Replace("\", "/")
    17.                 Dim destination As String = txtdownloadto & currentline
    18.                 _Downloader = New WebFileDownloader
    19.                 _Downloader.DownloadFileWithProgress(newurl, destination)
    20.                 currentline = SR.ReadLine()
    21.             Catch ex As Exception
    22.                 MsgBox(ex.Message)
    23.             End Try
    24.         Loop
    25.     End Sub
    26.     Private Sub _Downloader_FileDownloadSizeObtained(ByVal iFileSize As Long) Handles _Downloader.FileDownloadSizeObtained
    27.         ProgBar.Value = 0
    28.         ProgBar.Maximum = Convert.ToInt32(iFileSize)
    29.     End Sub
    30.     Private Sub _Downloader_FileDownloadComplete() Handles _Downloader.FileDownloadComplete
    31.         ProgBar.Value = ProgBar.Maximum
    32.         Processcompletion = True
    33.     End Sub
    34.     Private Sub _Downloader_FileDownloadFailed(ByVal ex As System.Exception) Handles _Downloader.FileDownloadFailed
    35.         Processcompletion = False
    36.         MsgBox("An error has occured during download: " & ex.Message)
    37.     End Sub
    38.     Private Sub _Downloader_AmountDownloadedChanged(ByVal iNewProgress As Long) Handles _Downloader.AmountDownloadedChanged
    39.         ProgBar.Value = Convert.ToInt32(iNewProgress)
    40.         lblProgress.Text = WebFileDownloader.FormatFileSize(iNewProgress) & " of " & WebFileDownloader.FormatFileSize(ProgBar.Maximum) & " downloaded"
    41.         Application.DoEvents()
    42.     End Sub
    43. End Class

    Edit, i went back through the code looking at the difference and it seems application.doevents() was the trick to not freezing. Why?
    Last edited by youngbucks; Dec 27th, 2008 at 04:41 PM.
    "Programming is like sex. One mistake and you have to support it for the rest of your life." ~Michael Sinz


    Code Snippets/Usefull Links:
    WinRAR DLL|Vista Style Form|Krypton Component Library|Windows Form Aero|Parsing XML files|Calculate File's CRC 32|Download a list of files.

  21. #21
    Super Moderator jmcilhinney's Avatar
    Join Date
    May 2005
    Location
    Sydney, Australia
    Posts
    110,344

    Re: [2008] Multithreading

    Going back to your own code, here's how you were calling ReportProgress:
    vb.net Code:
    1. BackgroundWorker1.ReportProgress(k + k, max)
    That's not right though because k is not the total amount read so far. It's just the amount read in the last pass. That amount will be the same every pass until the last one so your ProgressBar is always going to show the same value.

    It's for reasons like this that you MUST debug. You cannot just assume that you're using the correct data and you can't always see that you're not just by looking at the code. You have to run the code and see what values your variables contain at the time. Doing that you'd have seen that you were simply setting the Value of the ProgressBar to 8192 every time and never increasing it.

    Now, those comments are based on the most recent code you posted. If you'd followed mu instructions you should have changed that code since then but I don't know if you had changed that aspect of it.

  22. #22
    Super Moderator Shaggy Hiker's Avatar
    Join Date
    Aug 2002
    Location
    Idaho
    Posts
    39,041

    Re: [2008] Multithreading

    Application.DoEvents will allow the program to process all pending events, such as repaints, button clicks, etc. It comes with a cost, though, as it is not a cheap method to call (cost in time, of course). Multithreading isn't necessarily free, either, but it CAN take advantage of multiple cores, which will be far more efficient than a solution using DoEvents, as long as multiple cores are available.
    My usual boring signature: Nothing

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width