Accueil > Forum > > > > Problème de BackgroundWorker
Problème de BackgroundWorker
vendredi 5 décembre 2008 à 11:57:28 |
Problème de BackgroundWorker

LaNono
|
Bonjour à tous,
J'ai un programme qui effectue une traitement en boucle et durant ce traitement, il peut faire des opérations comme :
- Dessiner sur un composant graphics et sauvegarder ce fichier sur le disque
- Créer une capture d'écran
Si je n'utilise pas de multitâche, le traitement se passe très bien, les images sont créées et sauvées.
Comme le traitement dur un certain temps, j'ai insérer ce traitement dans un multithread à l'aide du composant BackgroundWorker. qui me permet d'avoir un bouton "Annuler" en cours du traitement
Mon problème est que depuis que j'utilise ce composant, des exceptions sont levées lorsque j'utilise l'instruction Save d'un objet bitmap et que la lecture de données dans le presse papier (Au moment de la capture d'écran) me retourne une valeur nulle.
Quelqu'un connait-il la raison de cette erreur? peut-on accéder à l'OS (Système de fichier, clipboard) depuis une application multithread?
merci d'avance
|
|
vendredi 5 décembre 2008 à 12:15:42 |
Re : Problème de BackgroundWorker

Le newbie
|
Salut, Si tu pouvais nous donner les exception qui sont levées on pourrait plus t'aider. Ensuite, est ce que tu fais ton le traitement de capture dans le background worker c'est à dire prise de l'image et enregistrement du fichier. Ou est ce que tu fais la capture dans le background et la sauvegarde dans ton thread principal. Il me semble que tu dois tout faire dans le background worker puisque les seuls échanges possibles entre tes threads sont des entiers qui te permettent de connaître l'état d'avancmeent de ton thread dérivé. Cela expliquerait peut être pourquoi ta capture est NULL. Un tuto sympa sur l'utilisation du BG : [ Lien ]Tiens nous au courant.
|
|
vendredi 5 décembre 2008 à 13:35:13 |
Re : Problème de BackgroundWorker

LaNono
|
Hello,
merci de ta réponse!
J'effectue l'entier du traitement des images dans le BackgroundWorker
l'exception levée lorsque j'utilise l'expression :
MonBitmap.Save(FileName, Imaging.ImageFormat.Bmp)
est la suivante :
L'exception System.Runtime.InteropServices.ExternalException n'a pas été gérée par le code utilisateur
ErrorCode=-2147467259
Message="Une erreur générique s'est produite dans GDI+."
Source="System.Drawing"
StackTrace:
à System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
à System.Drawing.Image.Save(String filename, ImageFormat format)
à DocumentationGOelan.DGToolImageManager.DGToolImageManager_DrawTool(String FileName, DGImageGOelan Image) dans D:\work\petignat_tp_goelan_trunk\Application\DocumentationGOelan\DocumentationGOelan\DGToolImageManager.vb:ligne 572
à DocumentationGOelan.DGGOelanManager.DGGOelanManager_SetGOelanGammeValues(List`1& Controls, List`1& GOelanImages, DGPaper& Paper, List`1& ReturnedDataList, List`1& ReturnedImageList, Int32 ProgressMaxValue, Int32& ProgressCurrentValue, BackgroundWorker& Worker, DoWorkEventArgs& WorkerEvent) dans D:\work\petignat_tp_goelan_trunk\Application\DocumentationGOelan\DocumentationGOelan\DGGOelanManager.vb:ligne 810
à DocumentationGOelan.DGGenerationFrm.DGGenerationFrm_ReadGOelanData(BackgroundWorker ReadWorker, DoWorkEventArgs WorkerEvent) dans D:\work\petignat_tp_goelan_trunk\Application\DocumentationGOelan\DocumentationGOelan\DGGenerationFrm.vb:ligne 150
à DocumentationGOelan.DGGenerationFrm.bgwBackground_DoWork(Object sender, DoWorkEventArgs WorkerEvent) dans D:\work\petignat_tp_goelan_trunk\Application\DocumentationGOelan\DocumentationGOelan\DGGenerationFrm.vb:ligne 183
à System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
à System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)
Concernant le clipboard, je l'utilise de la manière suivante :
Call keybd_event(System.Windows.Forms.Keys.Snapshot, 0, 0, 0)
data = Clipboard.GetDataObject()
Lorsque je suis dans le BackgroundWorker, data est à nothing alors qu'il contient l'image prise par la capture d'écran si je n'utilise pas de background worker
J'avoue que je suis un peu paumée (Disons que ces histoires de multitâche n'ont jamais vraiment été claires pour moi ;-) )
As-tu une idée de mon problème?
Merci encore
|
|
vendredi 5 décembre 2008 à 14:03:43 |
Re : Problème de BackgroundWorker

Le newbie
|
Merci des détails que tu as donné. 1. Est ce que tu as le même problème en faisant : System.Windows.Forms.Keys.PrintScreen 2. As tu bien mis un as New à ta déclaration de Data ? 2. Remplace ta déclaration de data en un truc du style Dim MaBmp as New System.Drawing.Bitmap(picImage.Image)En gros un objet de type image quoi comme ici http://msdn.microsoft.com/en-us/library/9t4syfhh.aspxUn exemple de quelqu'un qui a contourné le même problème que toi : [ Lien ]Personnelement, comme tu peux le voir, je ne pense en aucun cas que cela puisse venir du BGW. Je pense que c'est un pb de code. Cependant tu as l'air de dire que cela marche. PS : hésite pas à mettre un petit peu plus de code histoire qu'on comprènnent bien. Voir tes déclarations, des procédures complètes et si tu as des données confidentielles, tu les rempace par des XXXXXX par exemple mais n'hésite pas à en mettre plus.
|
|
vendredi 5 décembre 2008 à 15:41:19 |
Re : Problème de BackgroundWorker

LaNono
|
Re!
En fait, je crois que je me suis mal exprimée, je vais suivre ton conseil et mettre plus de code ;-)
Les deux erreurs que j'ai décrites se passent à deux endroits et pour deux tâches complètement différentes
Première erreur : Bitmap.save
------------------------------
Je viens de résoudre cette erreur :
En fait, comme j'ajoute la gestion avec le BackgroundWorker petit à petit, j'ai commenter toute la suite de mon code qui me prenait beaucoup de temps
Du coup, juste après que j'enregistre le bitmap, je n'ai plus rien à faire et je me retrouve à la fin de la fonction qui lance mon thread.
Le problème c'est qu'à la fin de cette fonction, une ligne de code supprime ces images, car elles sont temporaires
Ce qui s'est passé, c'est que les images étaient supprimées alors que leur enregistrement n'était même pas terminé. d'où l'erreur.
Deuxième erreur : Réalisation d'une capture d'écran
---------------------------------------------------
Le problème n'est pas de mettre mon code, mais c'est qu'il y a tellement de traitement pour arriver à la capture que c'est difficile à expliquer ;-)
J'ai donc reproduit l'erreur pour la capture d'écran par un petit exemple que voici :
' .: Forme principale du projet :.
' Cette forme contient deux boutons :
' 1 pour faire une capture sans BackgroundWorker
' 1 pour faire une capture dans un BackgroundWorker
Imports System.ComponentModel
Public Class Form1
'Capture d'écran sans BackgroundWorker
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
DGSnapshotGOelanManager_MakeBitmapFromScreenShot(Application.StartupPath + "/TMP/TMP.bmp")
End Sub
'Capture d'écran avec le backgroundWorker
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Me.bgw.RunWorkerAsync()
End Sub
Private Sub bgw_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork
Dim worker As System.ComponentModel.BackgroundWorker = CType(sender, System.ComponentModel.BackgroundWorker)
DGSnapshotGOelanManager_MakeBitmapFromScreenShot(Application.StartupPath + "/TMP/TMPbgw.bmp")
End Sub
End Class
'-------------------------------------------------------------------------------------------------------------------
' .:Module de gestion des captures d'écran :.
Imports System.Drawing
Imports System.Drawing.Imaging
Module DGSnapshotGOelanManager
'Procédure de l'API Windows keybd_event permettant de simluer une touche pressée au clavier
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
Private Function DGSnapshotGOelanManager_SaveScreen(ByVal FileName As String) As Boolean
Dim data As IDataObject
Dim bmap As Bitmap
Dim FramedBitmap As Bitmap
Dim Text As String = ""
Dim ImageGraphics As Graphics
'Récupération de l'image enregistrée dans le presse papier par la capture d'écran
data = Clipboard.GetDataObject()
'Enregistrement de cette image au format BMP
If data.GetDataPresent(GetType(System.Drawing.Bitmap)) Then
'Conversion de l'image au format bitmap
bmap = CType(data.GetData(GetType(System.Drawing.Bitmap)), Bitmap)
'recadrage de l'image
FramedBitmap = New Bitmap(System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width, System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height)
ImageGraphics = Graphics.FromImage(FramedBitmap)
ImageGraphics.DrawImage(bmap, New PointF(0, 0))
'Enregistrement de l'image au format Bitmap
FramedBitmap.Save(FileName, Imaging.ImageFormat.Bmp)
ImageGraphics.Dispose()
End If
End Function
Public Sub DGSnapshotGOelanManager_MakeBitmapFromScreenShot(ByVal FileName As String)
'Copie d'écran
Call keybd_event(System.Windows.Forms.Keys.PrintScreen, 0, 0, 0)
'attente que l'image soit finie de copier
System.Windows.Forms.Application.DoEvents()
DGSnapshotGOelanManager_SaveScreen(FileName)
End Sub
End Module
'-------------------------------------------------------------------------------------------------------------------
La solution sans BackgroundWorker (Bouton1) fonctionne très bien
Pour la solution dans le BackgroundWorker(Bouton2), l'instruction Clipboard.GetDataObject() retourne Nothing
Je ne comprend pas très bien ce qui peut se passer
Merci encore
|
|
vendredi 5 décembre 2008 à 15:58:49 |
Re : Problème de BackgroundWorker

Le newbie
|
Re : Est tu sur de pouvoir faire un call dans un BGW. Il me semble que les seuls events gérables sont ceux du BGW.
Call keybd_event(System.Windows.Forms.Keys.PrintScreen, 0, 0, 0) 'attente que l'image soit finie de copier System.Windows.Forms.Application.DoEvents()
Est ce que tu as mis un point d'arrêt pour voir s'il passait bien de partout. Ton problème serait peut être là.
@++
|
|
vendredi 5 décembre 2008 à 16:30:30 |
Re : Problème de BackgroundWorker

LaNono
|
Réponse acceptée !
Re !
Alors j'ai résolu mon problème grâce à ce lien :
http://social.technet.microsoft.com/Forums/en-US/netfxbcl/thread/112578d1-9011-4a5c-b4d9-1911cb683995/
Apparemment, mon problème vient du fait que BackgroundWorker travaille avec des threads en mode MTA alors qu'ils doivent être en mode STA pour accéder au clipboard.
j'ai pas tout compris mais tout fonctionne maintenant ;-)
merci encore pour ton aide
|
|
Cette discussion est classée dans : problème, composant, traitement, utilise, backgroundworker
Répondre à ce message
Sujets en rapport avec ce message
TRES URGENT : Crystal Report 8 [ par Marco ]
J'ai un gros problème avec Crystal Report 8 :J'ai créé des états dans VB avec le composant Report Designer de Crystal Reportet je les visualise avec
Problème avec les H et VscrollBar [ par yoda ]
Mon problème esr simple. Quand j'utilise une barre de défilement, j'arrive bien à faire descendre mon controle dans la feuille mais pas pour le faire
Problème de recordset [ par SAiSP00 ]
Bon je vous explique, dans mon prog j'utilise des recordset qui reprenne donc une requete, elles sont de type dynaset et lorsque j'utilise par ex : no
FileSystemObject [ par PEB ]
Lorsque j'utilise le FSO j'ai un problème avec la méthode CopyFolder qui me renvoie le message d'erreur suivant :Expected: =Mon code est le suivant :
Problème de droit sur composant upload [ par nours ]
Bonjour,J'ai dévelloppé une dll en vb qui me permet d'uploader des fichiers à partir de page ASP (dans le style d'ASPSmartUpload).Le problème est que
Help problème d'empaquetage [ par sharky ]
Débutant qui débute :)J'ai developpé une appli sous vb 6 entreprise / win98.J'amerais la tester chez moi sous win xp et j'ai un problème pour l'empaq
Problème avec l'affichage d'images [ par Jim ]
Bonjour,J'ai eu quelque peu un problème avec Windows. Après avoir supposéement arrangé les choses, toutes les icones qui sont utilisées pour en faire
Fenetre durant l'execution [ par jthersen ]
Salut à vous,J'ai un problème, chaque fois que je créédes programme VB de traitement d'information,donc des programmes qui vont traiter bcpd'élément à
Fonction replace en VBA, problème [ par Spylover ]
Bonjour,j'utilise chez moi Office XP et j'utilise la fonction replace(,,,) qui fonctionne très bien, à titre pro, j'essaie d'utiliser cette fonction e
Problème fonction replace(,,,) en VBA [ par Spylover ]
Bonjour,j'utilise chez moi Office XP et j'utilise la fonction replace(,,,) qui fonctionne très bien, à titre pro, j'essaie d'utiliser cette fonction e
Livres en rapport
|
Derniers Blogs
XNA IS DEAD!XNA IS DEAD! par richardc
Depuis la semaine dernière (et grâce aux TechDays 2012), je me penche activement sur la nouvelle version de Windows, aka Windows 8. Vous me direz, il était temps puisque la première preview date de Septembre dernier.
OK. Remarquez, on n'en est qu'aux...
Cliquez pour lire la suite de l'article par richardc TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 !TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 ! par ROMELARD Fabrice
Speakers: Fabrice Meillon et Stanislas Quastana Cette session est basée entièrement sur celle donnée lors de la BUILD cet hiver. Il n'y a pas d'ajout d'information en rapport avec cet évènement passé. Windows 8 Server sera intégralem...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [HTML5] AUTOUR DU W3C : NOUVEAUX STANDARDS ET WEB MOBILE (LILLE)[HTML5] AUTOUR DU W3C : NOUVEAUX STANDARDS ET WEB MOBILE (LILLE) par Gio
Je m'y prends un peu tard je sais, mais bon je suis développeur web et donc hyper fainéant ! Toujours dans le cadre des technologies émergentes, ici HTML5, parce qu'on aime HTML5 chez Wyg , nous seront présent, le vieux ( Aurélien V.) et moi, pour pr...
Cliquez pour lire la suite de l'article par Gio [WP7] DYNAMICALLY CHANGE STARTUP PAGE[WP7] DYNAMICALLY CHANGE STARTUP PAGE par KooKiz
Let's say that you want to allow the user to customize the startup page of your application. You can easily change the startup page by editing the 'NavigationPage' attribute in the manifest file. But the manifest cannot be modified once the applicatio...
Cliquez pour lire la suite de l'article par KooKiz
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|