begin process at 2012 02 17 02:16:52
  Trouver un code source :
 
dans
 
Accueil > Forum > 

VB.NET et VB 2005

 > 

Divers

 > 

Aide & Documentation

 > 

Help !! bin2hex avec multi-threading !! Urgent !!


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Help !! bin2hex avec multi-threading !! Urgent !!

vendredi 8 août 2008 à 10:18:49 | Help !! bin2hex avec multi-threading !! Urgent !!

XelectroX

Membre Club

Bonjour,
Je cherche quelqu'un qui serait capable de me faire fonctionner cela correctement (problème décrit à la fin) :
Public Class bin2hex
    Dim processes As Process
    Dim Thread1 As System.Threading.Thread
    Dim Thread2 As System.Threading.Thread

    Private Sub Open_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Open.Click
        OFD.InitialDirectory = My.Application.Info.DirectoryPath
        OFD.ShowDialog()
        txtIN.Text = OFD.FileName
    End Sub

    Private Sub Save_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Save.Click
        SFD.FileName = txtIN.Text & ".hex"
        SFD.ShowDialog()
        txtOUT.Text = SFD.FileName
    End Sub

    Private Sub Process_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Process.Click
        Dim input() As Byte = IO.File.ReadAllBytes(txtIN.Text)
        Dim output As String = ""
        PB.Visible = True
        PB.Maximum = input.Length + 2
        processes = New Process(input)
        CheckForIllegalCrossThreadCalls = False
        AddHandler processes.Progress, AddressOf progress
        Thread1 = New System.Threading.Thread(AddressOf processes.thread1)
        Thread1.Start()
        Thread2 = New System.Threading.Thread(AddressOf processes.thread2)
        Thread2.Start()
    End Sub

    Sub progress(ByVal pos As Long)
        Try
            PB.Value = pos
            Speed1.Text = "Thread1 : " & Int(processes.totalcalc1 / processes.totaltime1) & "calc/ms"
            Speed2.Text = "Thread2 : " & Int(processes.totalcalc2 / processes.totaltime2) & "calc/ms"
        Catch
        End Try
        Application.DoEvents()
        If pos >= processes.input.Length - 1 Then
            IO.File.WriteAllText(txtOUT.Text, processes.output)
            Try
                If My.Application.CommandLineArgs(0) <> ""And My.Application.CommandLineArgs(1) <> ""Then End
            Catch
            End Try
            MsgBox("Finished !", MsgBoxStyle.Information)
            PB.Visible = False
            Thread1.Abort()
            Thread2.Abort()
        End If
    End Sub

    Private Sub bin2hex_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Try
            If My.Application.CommandLineArgs(0) <> ""And My.Application.CommandLineArgs(1) <> ""Then
                txtIN.Text = My.Application.CommandLineArgs(0)
                txtOUT.Text = My.Application.CommandLineArgs(1)
                My.Application.DoEvents()
                Process_Click(sender, e)
            End If
        Catch
        End Try

    End Sub
End Class

Public Class process
    Public input() AsByte
    Public output() AsChar
    Public working1 AsBoolean
    Public working2 AsBoolean
    Dim watch1 As New Diagnostics.Stopwatch
    Dim watch2 As New Diagnostics.Stopwatch
    Public totaltime1 As Long
    Public totaltime2 As Long
    Public totalcalc1 As Long
    Public totalcalc2 As Long
    Dim pos As Long = -1

    Sub New(ByVal _input() As Byte)
        input = _input
        ReDim output(((input.Length - 1) * 2) + 1)
    End Sub

    Sub thread1()
        While pos < input.Length - 1
            working1 = True
            pos += 1
            watch1.Reset()
            watch1.Start()
            Dim MyPos As Long = pos
            Dim hexa As String = Hex(input(MyPos))
            If hexa.Length < 2 Then
                output(MyPos * 2) = "0"
                output((MyPos * 2) + 1) = hexa
            Else
                output(MyPos * 2) = Mid(hexa, 1, 1)
                output((MyPos * 2) + 1) = Mid(hexa, 2, 1)
            End If
            watch1.Stop()
            totaltime1 += watch1.ElapsedMilliseconds
            totalcalc1 += 1
            RaiseEvent Progress(pos)
            working1 = False
        End While
    
End Sub
    Sub thread2()
        While pos < input.Length - 1
            working2 = True
            pos += 1
            watch2.Reset()
            watch2.Start()
            Dim MyPos As Long = pos
            Dim hexa As String = Hex(input(MyPos))
            If hexa.Length < 2 Then
                output(MyPos * 2) = "0"
                output((MyPos * 2) + 1) = hexa
            Else
                output(MyPos * 2) = Mid(hexa, 1, 1)
                output((MyPos * 2) + 1) = Mid(hexa, 2, 1)
            End If
            watch2.Stop()
            totaltime2 += watch2.ElapsedMilliseconds
            totalcalc2 += 1
            RaiseEvent Progress(pos)
            working2 = False
        End While
    End Sub

    Public Event Progress(ByVal pos As Long)

End Class

J'explique mon problème, en fait mon fichier de sortie semble être bon mais contient des vides
Si quelqu'un saurait aussi me l'optimiser car j'ai des fichiers de plus en plus conséquents à traiter ...

Merci à tous

vendredi 8 août 2008 à 12:08:40 | Re : Help !! bin2hex avec multi-threading !! Urgent !!

nhervagault

Administrateur CodeS-SourceS
Réponse acceptée !
Salut ,

Apres une simple recherche sur internet
Je tombe sur
il te reste plus qu'a convertir avec
http://tools.codes-sources.com/

J'ai pas lu ton code mais la manipukation de string est tres longue
il faut travailler au niveau bytes

Voila

static string hex2bin(string hexdata)
{
if (hexdata == null)
throw new ArgumentNullException("hexdata");
if (hexdata.Length % 2 != 0)
throw new ArgumentException("hexdata should have even length");

byte[] bytes = new byte[hexdata.Length / 2];
for (int i = 0; i < hexdata.Length; i += 2)
bytes[i / 2] = (byte) (HexValue(hexdata[i]) * 0x10
+ HexValue(hexdata[i + 1]));
return Encoding.GetEncoding(1252).GetString(bytes);
}

static int HexValue(char c)
{
int ch = (int) c;
if (ch >= (int) '0' && ch <= (int) '9')
return ch - (int) '0';
if (ch >= (int) 'a' && ch <= (int) 'f')
return ch - (int) 'a' + 10;
if (ch >= (int) 'A' && ch <= (int) 'F')
return ch - (int) 'A' + 10;
throw new ArgumentException("Not a hexadecimal digit.");
}


et

> public static string bin2hex(string bindata)
> {
> byte[] bytes =
> Encoding.GetEncoding(1252).GetBytes(bindata);
> string hexString = "";
> for (int ii = 0; ii < bytes.Length; ii++)
> {
> hexString += bytes[ii].ToString("x2");
> }
> return hexString;
> }
vendredi 8 août 2008 à 14:05:52 | Re : Help !! bin2hex avec multi-threading !! Urgent !!

XelectroX

Membre Club
C'est déjà pas mal mais y aurait-il moyen de l'avoir en multi-threading ? Quelqu'un saurait comment faire ?
Sinon, reste plus qu'a le remettre en VB.NET ...
vendredi 8 août 2008 à 14:14:28 | Re : Help !! bin2hex avec multi-threading !! Urgent !!

nhervagault

Administrateur CodeS-SourceS
Pour le faire en multithreading ???
Ca sert a rien de se compliquer pour des choses aussi simple.

Regardes du coté du backgroundworker, il repond peut etre a la question

NB : Evites urgent dans Titre ,-)
vendredi 8 août 2008 à 15:48:43 | Re : Help !! bin2hex avec multi-threading !!

XelectroX

Membre Club
Ok, ben merci pour tout :)
vendredi 8 août 2008 à 15:55:24 | Re : Help !! bin2hex avec multi-threading !! Urgent !!

nhervagault

Administrateur CodeS-SourceS
Pourquoi tu ne reponds   pas à la question du multithreading ?
C'était une mauvaise piste ??
vendredi 8 août 2008 à 16:32:59 | Re : Help !! bin2hex avec multi-threading !! Urgent !!

XelectroX

Membre Club
J'ai pas essayé car mon but était de faire travailler les 2 core du processeur pour arriver à presque doubler la vitesse de calcul
Un backgroundworker n'est qu'un seul thread (d'ailleurs je ne sais même pas comment on l'utilise ni si on peut en utiliser 2) sinon, comme j'avais fait au début, j'avais des restes non calculés.
Je suis revenu au système basique (malgré qu'il faut 1 à 2 minutes pour un fichier de 512k)
vendredi 8 août 2008 à 17:40:14 | Re : Help !! bin2hex avec multi-threading !! Urgent !!

nhervagault

Administrateur CodeS-SourceS
Voila un article sur le multithreading a toi d'en faire bon usage

http://www.dotnetguru.org/articles/dossiers/threads/multithreading.htm
vendredi 8 août 2008 à 17:51:29 | Re : Help !! bin2hex avec multi-threading !! Urgent !!

Kevin.Ory

Réponse acceptée !
Salut,
"Un backgroundworker n'est qu'un seul thread"
Si t'en veux deux, tu en créé deux, tout simplement
C'est très facile à utiliser, et c'est parfait pour ton cas.

Après, si ton code est lent, c'est principalement à cause de l'appel de l'événement Progress. Ton thread de calcul va attendre que le thread principal aie affiché la progression avant de continuer => Super lent. Evite de le faire à chaque byte, mais fais le après 1000 (voir plus) bytes convertis par exemple.

Tu as deux thread dans ton code, mais après avoir regardé le code vite fais, j'ai l'impression que les deux thread font exactement la même chose? (tout le travail à double) Je pense qu'un seul thread séparé est largement suffisant.

Tes watch1.Reset(), watch1.Start() et watch1.Stop() te prennent aussi beaucoup de temps. Ne fais pas comme ça.

Je ne connais pas la fonction Hex. Mais je sais qu'on peut appeler la fonction ToString avec un paramètre "h" pour convertir en hexa, peut-être est ce plus rapide?

Alors comment faire? Tourne dans ton 2ème thread le plus vite possible pour faire ta conversion, tu ne fais que d'incrémenté une variable pour indiquer la progression. C'est dans ton thread principal, grâce à un Timer qui vient régulièrement (toute les secondes par ex) "voir" ta variable de progression que tu devrais faire le calcul pour savoir quel à été le temps de calcul (Temps/Progression) et afficher la progression.

Voilà



vendredi 8 août 2008 à 18:11:12 | Re : Help !! bin2hex avec multi-threading !! Urgent !!

XelectroX

Membre Club
Voilà, j'ai trouvé une idée ...
Je vais faire un thread qui va calculer la moitier du fichier, et un second pour l'autre moitier.
Je vais utiliser un timer réglé à 250ms(ou 500 si ca va plus vite) pour afficher la moyenne de vitesse de chaque thread

Y aurait-il moyen d'avoir un exemple de fonctionnement du backgroundworker ?

1 2

Cette discussion est classée dans : end, system, output, pos, mypos


Répondre à ce message

Sujets en rapport avec ce message

petit problème [ par maryouma ] bonjour à tout le mondeje veux manipumer une chaine de caractères reçu sur le port sériece traitement de chaine se fait chaque fois que j'ai une nouve NotifyIcon ContextMenu pas de form [ par Frich ] Bonjour à tous, je suis un débutant VBCe que je désir faire:aficher un systemIcon, mais sans afficher une fenêtre.avoir un menu contextuel qui permet convetir un bout de code en composant dll [ par Emcy ] bonjours,j'ai créer un label redimensionnable dans un userform : pour le créer, j'ai eu besoin d'utiliser plusieurs Label pour faire des poignées.Ce q ptit souci [ par nessx ] voila du a un formatge chez perdu un bout de mon code,et je n'arrive pu a me rappeller comment j'avais faitje clicke sur un label qui ouvre la boite d Creation de controle [ par Emcy ] Bonjours, j'ai créer dans un userform, un label deplaçable et redimensionnable en hauteur : je voudrais pouvoir créer simplement autant d'element de c timer et drawline [ par grimy51 ] Bonjour à tous.Voila j'ai un problème de taille , je voidrais réaliser un analyser d'état logiquedans un picturebox par le port parallèle.J'ai déja cr Petit probleme de password [ par bricesw2000 ] Bonjour à tous, c'est mon premier post sur ce forum mais ce n'est surement pas le dernier... je dois faire un programme pour creer, modifier ou sup déclaration de variable dans une classe [ par Emcy ] Voici mon Code :   Code:  Imports System  Imports System.Drawing  Imports System.Windows.Forms  Imports System.ComponentModel  Imports System.Drawing. PB Windows Service .NET installé sur Windows Server 2003 [ par zefiras ] Bonjour,J'ai développé un service windows en .NET dans le but de lancer un robot en ligne de commande tous le 5 minutes, utilisant un timer. Je l'ai t printpreviewdialog[vbnet] [ par stargates ] Bonjour,Lorsque j'affiche mon printpreviewdialog,celui se met derrière la form d'ou je l'ai appelécode pour la afficher la form Private <FON


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 5,866 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales