IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Scanner automatiquement a partir de plusieurs scanners branches sur le meme ordinateur en WIA. problemes


Sujet :

VB.NET

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 6
    Par défaut Scanner automatiquement a partir de plusieurs scanners branches sur le meme ordinateur en WIA. problemes
    Bonjour,
    Tout d'abord, puis-je vous demander d'etre indulgent vu qu'il s'agit ici de mon tout premier script VB. J'ai une experience (limitee cela dit) avec php et VBA, programmant des macros excel lorsque le besoin se fait sentir.

    Pour un projet au travail, j'ai besoin d'un programme qui est capable de scanner automatiquement ( a intervalles reguliers) a partir de plusieurs scanners connectes sur le meme ordinateur.
    n'ayant trouve aucune solution logicielle gratuite ou payant capable de faire cela, j'ai decide d'utiliser cela comme excuse pour apprendre un langage de programmation, a savoir VB.


    Le programme a l'heure actuelle, consiste en un formulaire dans lequel l'utilisateur entre les differents parametres de scan (resolution, couleur, etc.) ainsi que les dossiers et noms de fichiers.

    cliquer sur "start scanning" :
    - lance une premiere fois la fonction scannerloop (voir ci dessous)
    - demarre un timer qui appelle scannerlopp a chaque fois qu'il tick


    A l'heure actuelle, le programme fonctionne parfaitement si un seul scanner est present.

    Si plusieurs scanners son connectes en revanche, le premier scan se deroule sans soucis pour tous les scanners, mais lorsqu'il faut demarrer le second scan, rien ne se passe, les scanners se "bloquent" (si j'essaie d'y acceder j'ai le message : The WIA devide is busy")
    je dois alors le debrancher et le rebrancher.

    Ai-je oublie quelque chose comme de "refermer une session" ou de "deconnecter" un scanner a la fin de la boucle ?

    voici la fonction scannerloop :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
     Public Sub scannerloop()
     
            'format constants
            Const wiaFormatBMP = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}"
            Const wiaFormatPNG = "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}"
            Const wiaFormatGIF = "{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}"
            Const wiaFormatJPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"
            Const wiaFormatTIFF = "{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}"
     
     
            'file format
            Dim fileformat As String
            If Me.FileExt.SelectedItem = "TIF" Then fileformat = wiaFormatTIFF
            If Me.FileExt.SelectedItem = "JPEG" Then fileformat = wiaFormatJPEG
            If Me.FileExt.SelectedItem = "BMP" Then fileformat = wiaFormatBMP
            If Me.FileExt.SelectedItem = "PNG" Then fileformat = wiaFormatPNG
            If Me.FileExt.SelectedItem = "GIF" Then fileformat = wiaFormatGIF
     
            'colors
            Dim colorcode As Integer
            If Me.Colorbox.SelectedItem = "Black and white" Then colorcode = 4
            If Me.Colorbox.SelectedItem = "Greyscale" Then colorcode = 2
            If Me.Colorbox.SelectedItem = "Colour" Then colorcode = 1
     
            'Resolution
            Dim dpi As Integer
            dpi = Me.dpiBox.SelectedItem
            Dim horizextent = dpi * 8.2
            Dim vertextent = dpi * 11.6
     
     
            Dim j As String = 1
            Dim DeviceManager1 = CreateObject("WIA.DeviceManager")   'wia device manager
     
            For i = 1 To DeviceManager1.DeviceInfos.Count 'loop through all devices
     
                If DeviceManager1.DeviceInfos(i).Type = 1 Then  'Select only scanners, not webcams etc...
     
                    'startpoint to calculate how long it is to scan
                    Dim ScanStart = DateAndTime.Second(Now) + (DateAndTime.Minute(Now) * 60) + (DateAndTime.Hour(Now) * 3600)
     
     
                    'Directory + file
                    Dim targetdir = Me.ProjectFolderBox.Text & "\scans\Scanner" & j & "\S" & j & "_" & Me.FilePrefix.Text & Me.CurrFileIndex & "." & Me.FileExt.SelectedItem
                    Form2.CurrentActionLabel.Text = "Scanning from scanner #" & j
     
     
                    Dim Scanner As WIA.Device = DeviceManager1.DeviceInfos(i).connect
     
     
                    If IsNothing(Scanner) Then
                        Log(Me.logfilename, Now & " | Scanner #" & j & " not found")
                    Else
                        Try
                            Dim Img As WIA.ImageFile
     
                            With Scanner.Items(1)
                                .Properties("6146").Value = colorcode '4 is Black-white,gray is 2, color 1 (Color Intent)
                                .Properties("6147").Value = dpi  'dots per inch/horizontal
                                .Properties("6148").Value = dpi 'dots per inch/vertical
                                .Properties("6149").Value = 0 'x point where to start scan
                                .Properties("6150").Value = 0 'y-point where to start scan
     
                                'Following is A4 paper size. (Not 100% accurate because real A4 Ht errors)
                                .Properties("6151").Value = horizextent 'horizontal exent DPI x inches wide
                                .Properties("6152").Value = vertextent 'vertical extent DPI x inches tall
                                '  .Properties("4104").Value = 8 'bits per pixel
     
                            End With
     
                            'transfer image
                            Img = Scanner.Items(1).Transfer(fileformat) 'scans the image.
     
                            'kill previous file if exists to avoid errors
                            If System.IO.File.Exists(targetdir) = True Then
                                Kill(targetdir)
                            End If
     
                            Img.SaveFile(targetdir)
     
                            'last scan
                            Form2.LastFileLabel.Text = "\Scanner" & j & "\S" & j & "_" & Me.FilePrefix.Text & Me.CurrFileIndex & "." & Me.FileExt.SelectedItem
                            Form2.LastScanLabel.Text = Now
     
                        Catch ex As Exception
                            MsgBox(ex.Message)
                        Finally
     
                            Scanner = Nothing
                        End Try
                    End If
     
                    'End time for the scan
                    Dim ScanEnd = DateAndTime.Second(Now) + (DateAndTime.Minute(Now) * 60) + (DateAndTime.Hour(Now) * 3600)
     
                    'log
                    Log(Me.logfilename, Now & " | Scanner #" & j & " | Scanned " & targetdir & " | duration: " & (ScanEnd - ScanStart))
     
                    j = j + 1
     
                End If
     
     
     
            Next
            DeviceManager1 = Nothing
     
     
            Me.CurrFileIndex = Me.CurrFileIndex + 1
     
            Me.ScanCount = Me.ScanCount + 1
            Me.NextScan = DateAdd("n", Me.IntervalBox.Value, Now)
     
            Form2.ScanCountLabel.Text = Me.ScanCount
            Form2.NextScanLabel.Text = Me.NextScan
            Form2.CurrentActionLabel.Text = "Waiting..."
     
            'Increment next file index and update in config file
            Me.FileIndexBox.Value = Me.CurrFileIndex
            SaveCfg()
     
        End Sub

    Merci d'avance pour votre aide et encore une fois, soyez indulgent si le code est moche, c'est mon tout premier et je suis plus qu'avide d'apprendre

  2. #2
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 6
    Par défaut Nouveaux tests
    J'ai essaye d'autres choses, comme inclure la boucle qui passe en revue tous les device WIA detectes pour que cela scanne plusieurs fois independamment du reste du programme :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Dim DeviceManager1 = CreateObject("WIA.DeviceManager")   'wia device manager
     For k = 1 To 3
                Dim j As String = 1
                For i = 1 To DeviceManager1.DeviceInfos.Count 'loop through all devices
    [...]
              Next i
            Next k
            DeviceManager1 = Nothing

    Le premier tour de la boucle fonctionne, chaque scanner scanne une fois. Mais la encore, ca bloque au moment du deuxieme scan.
    J'ai essaye la meme chose en incluant la declaration du devicemanager et sa reinitialisation dans la boucle cette fois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     For k = 1 To 3 
    Dim DeviceManager1 = CreateObject("WIA.DeviceManager")   'wia device manager
                Dim j As String = 1
                For i = 1 To DeviceManager1.DeviceInfos.Count 'loop through all devices
    [...]
              Next i
            DeviceManager1 = Nothing
            Next k
    Mais ca ne change absolument rien.



    J'ai aussi essaye de logguer chaque etape dans un fichier texte pour voir ou cela bloque exactement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
            Dim DeviceManager1 = CreateObject("WIA.DeviceManager")   'wia device manager
            Dim j As String = 1
     
     
            For i = 1 To DeviceManager1.DeviceInfos.Count 'loop through all devices
                If DeviceManager1.DeviceInfos(i).Type = 1 Then  'Select only scanners, not webcams etc...
     
                    'startpoint to calculate how long it is to scan
                    Dim ScanStart = DateAndTime.Second(Now) + (DateAndTime.Minute(Now) * 60) + (DateAndTime.Hour(Now) * 3600)
     
     
                    'Directory + file
                    Dim targetdir = Me.ProjectFolderBox.Text & "\scans\Scanner" & j & "\S" & j & "_" & Me.FilePrefix.Text & Me.CurrFileIndex & "." & Me.FileExt.SelectedItem
                    Form2.CurrentActionLabel.Text = "Scanning from scanner #" & j
     
     
                    Dim Scanner As WIA.Device = DeviceManager1.DeviceInfos(i).connect
     
     
                    If IsNothing(Scanner) Then
                        Log(Me.logfilename, Now & " | Scanner #" & j & " not found")
                    Else
                        Try
                            Dim Img As WIA.ImageFile
     
                            'log
                            Log(Me.logfilename, Now & " | Scanner #" & j & " | Img initialized")
     
                            With Scanner.Items(1)
                                .Properties("6146").Value = colorcode '4 is Black-white,gray is 2, color 1 (Color Intent)
                                .Properties("6147").Value = dpi  'dots per inch/horizontal
                                .Properties("6148").Value = dpi 'dots per inch/vertical
                                .Properties("6149").Value = 0 'x point where to start scan
                                .Properties("6150").Value = 0 'y-point where to start scan
     
                                'Following is A4 paper size. (Not 100% accurate because real A4 Ht errors)
                                .Properties("6151").Value = horizextent 'horizontal exent DPI x inches wide
                                .Properties("6152").Value = vertextent 'vertical extent DPI x inches tall
                                '  .Properties("4104").Value = 8 'bits per pixel
     
                            End With
     
                            'log
                            Log(Me.logfilename, Now & " | Scanner #" & j & " | properties initialized")
     
                            'transfer image
                            Img = Scanner.Items(1).Transfer(fileformat) 'scans the image.
     
                            'log
                            Log(Me.logfilename, Now & " | Scanner #" & j & " |Transfer done")
     
                            'kill previous file if exists to avoid errors
                            If System.IO.File.Exists(targetdir) = True Then
                                Kill(targetdir)
                                'log
                                Log(Me.logfilename, Now & " | Scanner #" & j & " | deleted existing " & targetdir)
     
                            End If
     
                            Img.SaveFile(targetdir)
                            'log
                            Log(Me.logfilename, Now & " | Scanner #" & j & " | saved " & targetdir)
     
                            'last scan
                            Form2.LastFileLabel.Text = "\Scanner" & j & "\S" & j & "_" & Me.FilePrefix.Text & Me.CurrFileIndex & "." & Me.FileExt.SelectedItem
                            Form2.LastScanLabel.Text = Now
     
                        Catch ex As Exception
                            MsgBox(ex.Message)
                        Finally
     
                            Scanner = Nothing
                        End Try
                    End If
     
                    'End time for the scan
                    Dim ScanEnd = DateAndTime.Second(Now) + (DateAndTime.Minute(Now) * 60) + (DateAndTime.Hour(Now) * 3600)
     
                    'log
                    Log(Me.logfilename, Now & " | Scanner #" & j & " | Scanned " & targetdir & " | duration: " & (ScanEnd - ScanStart))
     
                    j = j + 1
     
                End If
     
            Next i

    Et voici le fichier de log genere :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Scan starts 29/11/2012 9:24:31 AM | Interval :Start scanning with 5 min | Res:100 DPI | 
    29/11/2012 9:24:31 AM | Scanner #1 | Img initialized
    29/11/2012 9:24:31 AM | Scanner #1 | properties initialized
    29/11/2012 9:24:49 AM | Scanner #1 |Transfer done
    29/11/2012 9:24:49 AM | Scanner #1 | saved C:\__2\scans\Scanner1\S1_img_1.TIF
    29/11/2012 9:24:49 AM | Scanner #1 | Scanned C:\__2\scans\Scanner1\S1_img_1.TIF | duration: 18
    29/11/2012 9:24:49 AM | Scanner #2 | Img initialized
    29/11/2012 9:24:49 AM | Scanner #2 | properties initialized
    29/11/2012 9:25:08 AM | Scanner #2 |Transfer done
    29/11/2012 9:25:08 AM | Scanner #2 | saved C:\__2\scans\Scanner2\S2_img_1.TIF
    29/11/2012 9:25:08 AM | Scanner #2 | Scanned C:\__2\scans\Scanner2\S2_img_1.TIF | duration: 19
    29/11/2012 9:25:08 AM | Scanner #1 | Img initialized
    29/11/2012 9:25:08 AM | Scanner #1 | properties initialized
    Il semble que cela bloque a cette etape:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Img = Scanner.Items(1).Transfer(fileformat) 'scans the image.




    Il semble que WIA est content de passer du scanner #1 au scanner #2 mais refuse de revenir au scanner #1 ensuite.
    Aussi, chose surprenante, lors du deuxieme tour de la boucle, le scanner #1 est cense scanner a nouveau mais c'est le scanner #2 qui se met a clignoter et bloque.
    Est-il possible que WIA selectionne le dernier scanner utilise (scanner #2) comme scanner par defaut ?
    Si oui, est il possible de reinitialiser cela ? Aussi, pourquoi cela ne le fait-il pas pour passer du scanner #1 au scanner #2 ?


    Merci d'avance pour votre aide.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 6
    Par défaut
    Personne ne peut m'aider ?

Discussions similaires

  1. Plusieurs boutons submit sur la meme page
    Par KaNDeL dans le forum Langage
    Réponses: 5
    Dernier message: 26/04/2009, 19h01
  2. Mettre plusieurs combo box sur une meme ligne
    Par hugo69 dans le forum Ext JS / Sencha
    Réponses: 4
    Dernier message: 13/11/2008, 15h42
  3. Plusieurs clients oracle sur le meme poste
    Par Fofy_einstein dans le forum Administration
    Réponses: 1
    Dernier message: 07/05/2008, 18h59
  4. Plusieurs application XMLRAD sur le meme serveur IIS6
    Par powerlog dans le forum XMLRAD
    Réponses: 3
    Dernier message: 13/09/2006, 17h25
  5. plusieurs threads ecrivent sur la meme socket
    Par estergiou dans le forum C++
    Réponses: 3
    Dernier message: 04/11/2005, 01h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo