J'ai besoin d'un peu d'aide pour comprendre un problème lié aux Threads:
J'ai écrit une fonction "BrowserObjects()" pour tester des contenus de pages
html.
...
IHTMLDocument3 currentDoc = (IHTMLDocument3)ObjectFromLResult(lRes, ref
IID_IHTMLDocument,0);
IHTMLElementCollection frameCol = currentDoc.getElementsByTagName("FRAME");
foreach (IHTMLElement element in frameCol)
{
if (element is IHTMLElement)
{
DispHTMLFrameElement frameElement = (DispHTMLFrameElement)element;
IHTMLWindow2 newWindow = frameElement.contentWindow;
//InvalidCastException, si appelé dans un thread différent ?
....
}
}
...
cela fonctionne sans problèmes, sauf si j'appelle la fonction à partir d'un
autre thread :
Thread secThread = new Thread(new ThreadStart(RunWebTest);
secThread.Start();
public void RunWebTest()
{
...
BrowserObjects();
...
}
chaque fois que je fais appel à la fonction, je récupère une
"InvalidCastException : Schnittstelle wird nicht unterstützt." (VS .NET
allemand, sans doute
Interface non disponible ou qqchose comme ça)
Est-ce que qqun pourrait m'expliquer pourquoi cette exception n'apparait que
lorsque je fais appel à la fonction dans un autre thread? Est-ce que c'est
un problème général avec les interfaces/threads? Et si oui, pourquoi est-ce
que cela n'arrive pas déjà avec IHTMLDocument3, et seulement avec
IHTMLWindow2 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Frederic Melantois
Bonjour,
Tout d'abord, la ligne "if (element is IHTMLElement)" ne sert à rien.
Il faudrait la remplacer par
if (element is DispHTMLFrameElement)
Ensuite, dans les opérations asynchronnes, il est souvent nécessaire de locker une référence d'objet. <code> lock(mareference) { // mon traitement } </code>
Dans votre cas, quelle référence faut-il locker ? Est-il nécessaire d'en locker une ? je ne peux vous répondre ne connaissant pas les objets que vous employez.
Frédéric Mélantois
"Ulf Bietz" a écrit dans le message de news:cbdpia$eu$
J'ai besoin d'un peu d'aide pour comprendre un problème lié aux Threads: J'ai écrit une fonction "BrowserObjects()" pour tester des contenus de
pages
html.
... IHTMLDocument3 currentDoc = (IHTMLDocument3)ObjectFromLResult(lRes, ref IID_IHTMLDocument,0); IHTMLElementCollection frameCol currentDoc.getElementsByTagName("FRAME"); foreach (IHTMLElement element in frameCol) { if (element is IHTMLElement) { DispHTMLFrameElement frameElement = (DispHTMLFrameElement)element; IHTMLWindow2 newWindow = frameElement.contentWindow; //InvalidCastException, si appelé dans un thread différent ? .... } } ...
cela fonctionne sans problèmes, sauf si j'appelle la fonction à partir
d'un
autre thread :
Thread secThread = new Thread(new ThreadStart(RunWebTest); secThread.Start();
public void RunWebTest() { ... BrowserObjects(); ... }
chaque fois que je fais appel à la fonction, je récupère une "InvalidCastException : Schnittstelle wird nicht unterstützt." (VS .NET allemand, sans doute Interface non disponible ou qqchose comme ça) Est-ce que qqun pourrait m'expliquer pourquoi cette exception n'apparait
que
lorsque je fais appel à la fonction dans un autre thread? Est-ce que c'est un problème général avec les interfaces/threads? Et si oui, pourquoi
est-ce
que cela n'arrive pas déjà avec IHTMLDocument3, et seulement avec IHTMLWindow2 ?
merci d'avance :)
Ulf
Bonjour,
Tout d'abord, la ligne "if (element is IHTMLElement)" ne sert à rien.
Il faudrait la remplacer par
if (element is DispHTMLFrameElement)
Ensuite, dans les opérations asynchronnes, il est souvent nécessaire de
locker une référence d'objet.
<code>
lock(mareference)
{
// mon traitement
}
</code>
Dans votre cas, quelle référence faut-il locker ? Est-il nécessaire d'en
locker une ? je ne peux vous répondre ne connaissant pas les objets que vous
employez.
Frédéric Mélantois
"Ulf Bietz" <ulf@nospam.com> a écrit dans le message de
news:cbdpia$eu$1@ngspool-d02.news.aol.com...
J'ai besoin d'un peu d'aide pour comprendre un problème lié aux Threads:
J'ai écrit une fonction "BrowserObjects()" pour tester des contenus de
pages
html.
...
IHTMLDocument3 currentDoc = (IHTMLDocument3)ObjectFromLResult(lRes, ref
IID_IHTMLDocument,0);
IHTMLElementCollection frameCol currentDoc.getElementsByTagName("FRAME");
foreach (IHTMLElement element in frameCol)
{
if (element is IHTMLElement)
{
DispHTMLFrameElement frameElement = (DispHTMLFrameElement)element;
IHTMLWindow2 newWindow = frameElement.contentWindow;
//InvalidCastException, si appelé dans un thread différent ?
....
}
}
...
cela fonctionne sans problèmes, sauf si j'appelle la fonction à partir
d'un
autre thread :
Thread secThread = new Thread(new ThreadStart(RunWebTest);
secThread.Start();
public void RunWebTest()
{
...
BrowserObjects();
...
}
chaque fois que je fais appel à la fonction, je récupère une
"InvalidCastException : Schnittstelle wird nicht unterstützt." (VS .NET
allemand, sans doute
Interface non disponible ou qqchose comme ça)
Est-ce que qqun pourrait m'expliquer pourquoi cette exception n'apparait
que
lorsque je fais appel à la fonction dans un autre thread? Est-ce que c'est
un problème général avec les interfaces/threads? Et si oui, pourquoi
est-ce
que cela n'arrive pas déjà avec IHTMLDocument3, et seulement avec
IHTMLWindow2 ?
Tout d'abord, la ligne "if (element is IHTMLElement)" ne sert à rien.
Il faudrait la remplacer par
if (element is DispHTMLFrameElement)
Ensuite, dans les opérations asynchronnes, il est souvent nécessaire de locker une référence d'objet. <code> lock(mareference) { // mon traitement } </code>
Dans votre cas, quelle référence faut-il locker ? Est-il nécessaire d'en locker une ? je ne peux vous répondre ne connaissant pas les objets que vous employez.
Frédéric Mélantois
"Ulf Bietz" a écrit dans le message de news:cbdpia$eu$
J'ai besoin d'un peu d'aide pour comprendre un problème lié aux Threads: J'ai écrit une fonction "BrowserObjects()" pour tester des contenus de
pages
html.
... IHTMLDocument3 currentDoc = (IHTMLDocument3)ObjectFromLResult(lRes, ref IID_IHTMLDocument,0); IHTMLElementCollection frameCol currentDoc.getElementsByTagName("FRAME"); foreach (IHTMLElement element in frameCol) { if (element is IHTMLElement) { DispHTMLFrameElement frameElement = (DispHTMLFrameElement)element; IHTMLWindow2 newWindow = frameElement.contentWindow; //InvalidCastException, si appelé dans un thread différent ? .... } } ...
cela fonctionne sans problèmes, sauf si j'appelle la fonction à partir
d'un
autre thread :
Thread secThread = new Thread(new ThreadStart(RunWebTest); secThread.Start();
public void RunWebTest() { ... BrowserObjects(); ... }
chaque fois que je fais appel à la fonction, je récupère une "InvalidCastException : Schnittstelle wird nicht unterstützt." (VS .NET allemand, sans doute Interface non disponible ou qqchose comme ça) Est-ce que qqun pourrait m'expliquer pourquoi cette exception n'apparait
que
lorsque je fais appel à la fonction dans un autre thread? Est-ce que c'est un problème général avec les interfaces/threads? Et si oui, pourquoi
est-ce
que cela n'arrive pas déjà avec IHTMLDocument3, et seulement avec IHTMLWindow2 ?
IHTMLDocument3 myInstance (IHTMLDocument3)Win32.ObjectFromLresult(lRes,ref IID_IHTMLDocument,0); IHTMLElementCollection elements = myInstance.getElementsByTagName("FRAME");
foreach(IHTMLElement element in elements ) { if(element is IHTMLFrameElement) { DispHTMLFrameElement frameElement = (DispHTMLFrameElement)element; IHTMLWindow2 window = frameElement.contentWindow; IHTMLDocument2 frameDoc = window.document; IHTMLElementCollection allTag = frameDoc.all; foreach(IHTMLElement myTag in allTag) { if ((myTag.tagName.Equals("INPUT") || myTag.tagName.Equals("A"))&& myTag.outerHTML.IndexOf("login")>=0) { MessageBox.Show("Login found"); } } } } proc.Kill(); }
le procédé de locker une référence me semble une piste prometteuse, mais je dois avouer que je nage un peu .....
merci :)
Ulf
"Frederic Melantois" schrieb im Newsbeitrag news:cbe2sc$1o2$
Bonjour,
Tout d'abord, la ligne "if (element is IHTMLElement)" ne sert à rien.
Il faudrait la remplacer par
if (element is DispHTMLFrameElement)
Ensuite, dans les opérations asynchronnes, il est souvent nécessaire de locker une référence d'objet. <code> lock(mareference) { // mon traitement } </code>
Dans votre cas, quelle référence faut-il locker ? Est-il nécessaire d'en locker une ? je ne peux vous répondre ne connaissant pas les objets que
IHTMLDocument3 myInstance (IHTMLDocument3)Win32.ObjectFromLresult(lRes,ref IID_IHTMLDocument,0);
IHTMLElementCollection elements = myInstance.getElementsByTagName("FRAME");
foreach(IHTMLElement element in elements )
{
if(element is IHTMLFrameElement)
{
DispHTMLFrameElement frameElement = (DispHTMLFrameElement)element;
IHTMLWindow2 window = frameElement.contentWindow;
IHTMLDocument2 frameDoc = window.document;
IHTMLElementCollection allTag = frameDoc.all;
foreach(IHTMLElement myTag in allTag)
{
if ((myTag.tagName.Equals("INPUT") || myTag.tagName.Equals("A"))&&
myTag.outerHTML.IndexOf("login")>=0)
{
MessageBox.Show("Login found");
}
}
}
}
proc.Kill();
}
le procédé de locker une référence me semble une piste prometteuse, mais je
dois avouer que je nage un peu .....
merci :)
Ulf
"Frederic Melantois" <fmelantois@ancienallaban.fr> schrieb im Newsbeitrag
news:cbe2sc$1o2$1@s1.read.news.oleane.net...
Bonjour,
Tout d'abord, la ligne "if (element is IHTMLElement)" ne sert à rien.
Il faudrait la remplacer par
if (element is DispHTMLFrameElement)
Ensuite, dans les opérations asynchronnes, il est souvent nécessaire de
locker une référence d'objet.
<code>
lock(mareference)
{
// mon traitement
}
</code>
Dans votre cas, quelle référence faut-il locker ? Est-il nécessaire d'en
locker une ? je ne peux vous répondre ne connaissant pas les objets que
IHTMLDocument3 myInstance (IHTMLDocument3)Win32.ObjectFromLresult(lRes,ref IID_IHTMLDocument,0); IHTMLElementCollection elements = myInstance.getElementsByTagName("FRAME");
foreach(IHTMLElement element in elements ) { if(element is IHTMLFrameElement) { DispHTMLFrameElement frameElement = (DispHTMLFrameElement)element; IHTMLWindow2 window = frameElement.contentWindow; IHTMLDocument2 frameDoc = window.document; IHTMLElementCollection allTag = frameDoc.all; foreach(IHTMLElement myTag in allTag) { if ((myTag.tagName.Equals("INPUT") || myTag.tagName.Equals("A"))&& myTag.outerHTML.IndexOf("login")>=0) { MessageBox.Show("Login found"); } } } } proc.Kill(); }
le procédé de locker une référence me semble une piste prometteuse, mais je dois avouer que je nage un peu .....
merci :)
Ulf
"Frederic Melantois" schrieb im Newsbeitrag news:cbe2sc$1o2$
Bonjour,
Tout d'abord, la ligne "if (element is IHTMLElement)" ne sert à rien.
Il faudrait la remplacer par
if (element is DispHTMLFrameElement)
Ensuite, dans les opérations asynchronnes, il est souvent nécessaire de locker une référence d'objet. <code> lock(mareference) { // mon traitement } </code>
Dans votre cas, quelle référence faut-il locker ? Est-il nécessaire d'en locker une ? je ne peux vous répondre ne connaissant pas les objets que
IHTMLDocument3 myInstance > (IHTMLDocument3)Win32.ObjectFromLresult(lRes,ref IID_IHTMLDocument,0); IHTMLElementCollection elements = myInstance.getElementsByTagName("FRAME");
foreach(IHTMLElement element in elements ) { if(element is IHTMLFrameElement) { DispHTMLFrameElement frameElement = (DispHTMLFrameElement)element; IHTMLWindow2 window = frameElement.contentWindow; IHTMLDocument2 frameDoc = window.document; IHTMLElementCollection allTag = frameDoc.all; foreach(IHTMLElement myTag in allTag) { if ((myTag.tagName.Equals("INPUT") || myTag.tagName.Equals("A"))&& myTag.outerHTML.IndexOf("login")>=0) { MessageBox.Show("Login found"); } } } } proc.Kill(); }
le procédé de locker une référence me semble une piste prometteuse, mais je dois avouer que je nage un peu .....
merci :)
Ulf
"Frederic Melantois" schrieb im Newsbeitrag news:cbe2sc$1o2$ > Bonjour, > > Tout d'abord, la ligne "if (element is IHTMLElement)" ne sert à rien. > > Il faudrait la remplacer par > > if (element is DispHTMLFrameElement) > > Ensuite, dans les opérations asynchronnes, il est souvent nécessaire de > locker une référence d'objet. > <code> > lock(mareference) > { > // mon traitement > } > </code> > > Dans votre cas, quelle référence faut-il locker ? Est-il nécessaire d'en > locker une ? je ne peux vous répondre ne connaissant pas les objets que vous > employez. > > Frédéric Mélantois
Rechercher le sample de Chat (en VB) sur le MSDN, il montre un exemple avec SyncLock (lock en C#)
Sinon il existe 2 autres façons de procéder : (je l'ai lu mais je ne saurai pas le faire facilement)
IHTMLDocument3 myInstance > (IHTMLDocument3)Win32.ObjectFromLresult(lRes,ref IID_IHTMLDocument,0);
IHTMLElementCollection elements = myInstance.getElementsByTagName("FRAME");
foreach(IHTMLElement element in elements )
{
if(element is IHTMLFrameElement)
{
DispHTMLFrameElement frameElement = (DispHTMLFrameElement)element;
IHTMLWindow2 window = frameElement.contentWindow;
IHTMLDocument2 frameDoc = window.document;
IHTMLElementCollection allTag = frameDoc.all;
foreach(IHTMLElement myTag in allTag)
{
if ((myTag.tagName.Equals("INPUT") || myTag.tagName.Equals("A"))&&
myTag.outerHTML.IndexOf("login")>=0)
{
MessageBox.Show("Login found");
}
}
}
}
proc.Kill();
}
le procédé de locker une référence me semble une piste prometteuse, mais je
dois avouer que je nage un peu .....
merci :)
Ulf
"Frederic Melantois" <fmelantois@ancienallaban.fr> schrieb im Newsbeitrag
news:cbe2sc$1o2$1@s1.read.news.oleane.net...
> Bonjour,
>
> Tout d'abord, la ligne "if (element is IHTMLElement)" ne sert à rien.
>
> Il faudrait la remplacer par
>
> if (element is DispHTMLFrameElement)
>
> Ensuite, dans les opérations asynchronnes, il est souvent nécessaire de
> locker une référence d'objet.
> <code>
> lock(mareference)
> {
> // mon traitement
> }
> </code>
>
> Dans votre cas, quelle référence faut-il locker ? Est-il nécessaire d'en
> locker une ? je ne peux vous répondre ne connaissant pas les objets que
vous
> employez.
>
> Frédéric Mélantois
IHTMLDocument3 myInstance > (IHTMLDocument3)Win32.ObjectFromLresult(lRes,ref IID_IHTMLDocument,0); IHTMLElementCollection elements = myInstance.getElementsByTagName("FRAME");
foreach(IHTMLElement element in elements ) { if(element is IHTMLFrameElement) { DispHTMLFrameElement frameElement = (DispHTMLFrameElement)element; IHTMLWindow2 window = frameElement.contentWindow; IHTMLDocument2 frameDoc = window.document; IHTMLElementCollection allTag = frameDoc.all; foreach(IHTMLElement myTag in allTag) { if ((myTag.tagName.Equals("INPUT") || myTag.tagName.Equals("A"))&& myTag.outerHTML.IndexOf("login")>=0) { MessageBox.Show("Login found"); } } } } proc.Kill(); }
le procédé de locker une référence me semble une piste prometteuse, mais je dois avouer que je nage un peu .....
merci :)
Ulf
"Frederic Melantois" schrieb im Newsbeitrag news:cbe2sc$1o2$ > Bonjour, > > Tout d'abord, la ligne "if (element is IHTMLElement)" ne sert à rien. > > Il faudrait la remplacer par > > if (element is DispHTMLFrameElement) > > Ensuite, dans les opérations asynchronnes, il est souvent nécessaire de > locker une référence d'objet. > <code> > lock(mareference) > { > // mon traitement > } > </code> > > Dans votre cas, quelle référence faut-il locker ? Est-il nécessaire d'en > locker une ? je ne peux vous répondre ne connaissant pas les objets que vous > employez. > > Frédéric Mélantois
Frederic Melantois
Merci de votre réponse. (je n'avais pas pu essayer votre code car il me manquait des références outre le mshtml).
Comme ça m'intéresse, et que je ne connais pas le modèle MTA (je fais pas de c++), j'ai un peu cherché.
Voici donc quelques liens qui permettent de comprendre :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/scalenetchapt07.asp (chapitre du bouquin de référence "Improving .NET Application Performance and Scalability")
et le tout fonctionne parfaitement. Je passerai néanmoins encore qq heures avec MSDN pour en comprendre la raison :)
Ulf
Merci de votre réponse.
(je n'avais pas pu essayer votre code car il me manquait des références
outre le mshtml).
Comme ça m'intéresse, et que je ne connais pas le modèle MTA (je fais pas de
c++), j'ai un peu cherché.
Voici donc quelques liens qui permettent de comprendre :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/scalenetchapt07.asp
(chapitre du bouquin de référence "Improving .NET Application Performance
and Scalability")
Merci de votre réponse. (je n'avais pas pu essayer votre code car il me manquait des références outre le mshtml).
Comme ça m'intéresse, et que je ne connais pas le modèle MTA (je fais pas de c++), j'ai un peu cherché.
Voici donc quelques liens qui permettent de comprendre :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/scalenetchapt07.asp (chapitre du bouquin de référence "Improving .NET Application Performance and Scalability")