Thread mon programme plante :(

cs_badrbadr Messages postés 475 Date d'inscription jeudi 19 juin 2003 Statut Membre Dernière intervention 3 novembre 2008 - 7 avril 2006 à 07:40
cs_badrbadr Messages postés 475 Date d'inscription jeudi 19 juin 2003 Statut Membre Dernière intervention 3 novembre 2008 - 7 avril 2006 à 17:10
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

cs_badrbadr Messages postés 475 Date d'inscription jeudi 19 juin 2003 Statut Membre Dernière intervention 3 novembre 2008 1
7 avril 2006 à 07:43
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] @++
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
7 avril 2006 à 09:10
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
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
7 avril 2006 à 09:21
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_badrbadr Messages postés 475 Date d'inscription jeudi 19 juin 2003 Statut Membre Dernière intervention 3 novembre 2008 1
7 avril 2006 à 17:10
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] @++
0
Rejoignez-nous