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 [B]automatiquement [/B] ( 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 :
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 :
- 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 :
- 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 :
- 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 :
- 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 :
- 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.