Thread mon programme plante :(

Signaler
Messages postés
475
Date d'inscription
jeudi 19 juin 2003
Statut
Membre
Dernière intervention
3 novembre 2008
-
Messages postés
475
Date d'inscription
jeudi 19 juin 2003
Statut
Membre
Dernière intervention
3 novembre 2008
-
Salut tout le monde,
Je suis en train de travailler sur une application qui prend des captures d'écran de pages web. J'utilise pour cela le contrôle WebBrowser (avec la fonction DrawToBitmap). Le problème, c'est qu'il faut attendre le chargement de la page web avant de dessiner celle-ci sur un bitmap. J'ai donc penser à utiliser des Thread avec la classe ManualResetEvent pour arrêter le déroulement de mon programme jusqu'à ce que la page soit bien chargée. Voici un bout de mon code :


private string url null;<?xml:namespace prefix o ns = "urn:schemas-microsoft-com:office:office" />


private WebBrowser webBrowser = new WebBrowser();


private Bitmap bmp = null;
public ManualResetEvent mre = new
ManualResetEvent(
false)
;



public Bitmap TakeScreenShot()


{


Thread t = new Thread(new ThreadStart(_TakeScreenShot));


t.Start();


if (mre != null) mre.WaitOne();


return bmp;


}


private void _TakeScreenShot()


{


webBrowser.Navigate(url);


this.webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted);


//pour que mon thread ne se termine pas tout de suite


while (true)


{


Application.DoEvents();


}


}


private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)


{


bmp = new Bitmap(webBrowser.Bounds.Width, webBrowser.Bounds.Height);


webBrowser.BringToFront();


webBrowser.DrawToBitmap(bmp, webBrowser.Bounds);


if (mre != null) mre.Set();


}

J'ai l'impression que mre.Set ne se déclenche jamais :(
Je suis vraiment débutant avec les threads alors si vous pouvez m'aider parce que ça fait 3 heures que j'essaie toutes les combinaisons possibles.

Merci d'avance

[:D] @++

5 réponses

Messages postés
475
Date d'inscription
jeudi 19 juin 2003
Statut
Membre
Dernière intervention
3 novembre 2008

eh misère,
j'avais mis de la couleur moi
lien vers la question avec la coloration : http://www3.sympatico.ca/red.zrari/thread.html

[:D] @++
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Hello,
Etant donné que tu as un event qui te permet de savoir quand le chargement de la page est terminé, je ne comprend pas pourquoi tu as besoin de thread pour faire cette action ?!
Le morceau de code fait exactement ce que tu veux (à une petite exception prêt) :



private
void webBrowser1_DocumentCompleted(
object sender,
WebBrowserDocumentCompletedEventArgs e)
{

Bitmap bmp =
new
Bitmap(
this.webBrowser1.Bounds.Width, webBrowser1.Bounds.Height);
webBrowser1.BringToFront();
webBrowser1.DrawToBitmap(bmp, webBrowser1.Bounds);
bmp.Save(
"test.jpg");
}

La petite exception, c'est que la méthode DrawToBitmap n'est pas supporté par ce control...
Plutôt embêtant !


<HR>
/auteurdetail.aspx?ID=13319[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever /infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Messages postés
475
Date d'inscription
jeudi 19 juin 2003
Statut
Membre
Dernière intervention
3 novembre 2008

J'ai lu ces articles et le programme marche très bien.

Ta question : Pourquoi tu as besoin d'un thread pour faire cette action?
Réponse : J'aurais bien aimer éviter d'en utiliser, le problème, c'est que je veux insérer cette fonction dans une page asp.net dont l'execution est linéaire. Quand je m'enregistre auprès de l'event, mon application continue son déroulement même si l'évenement en question ne fut pas encore déclenché.
Il faut donc que je bloque l'execution de mon programme jusqu'à ce que l'événment se déclenche et ensuite continuer l'execution.

C'est assez tordu mais j'ai l'impression que c'est le seul moyen.

[:D] @++