Y-t-il un bon moyen pour appeler une fonction d'une classe VB6 contenue=20
dans un activex dll, via une thread c# ?
Je m'explique :=20
J'ai une classe CInteropCall qui encapsule un appel vers une methode de=20
classe VB6 via une DLL Active X.
La grosse fonction s'appelle FillAlloc_ArrayStruct_Double(), qui alloue=20
un enorme tableau de structure via une boucle interne (for i =3D 1 to=20
300000...)
J'appelle cette longue fonction via une thread depuis ma forme princpale=20
UI :=20
Voici la methode TestMe() de la classe CInteropCall qui appelle la=20
methode VB6 via une instance de classe de l'activex dll ("interop=E9") :=20
public void TestMe()
{
AX_DLL.FillAlloc_ArrayStruct_Double(3000000, ref array_struct_double);
}
Le probleme est le suivant :=20
Mon interface se bloque lors du demarrage de la thread, puis rend la=20
main =E0 la fenetre principale tout en s'executant en background, mais se=
=20
rebloque de temps en temps pendant l'execution.
J'a test=E9 :=20
- ajout de Sleep(1) dans la boucle interne de la fonction VB6.
Pas de grand changement.
- ajout DoEvents() dans la boucle interne de la fonction VB6.
Pas de grand changement, mais ralenti le temps d'execution de la thread.
En faisant la routine de test depuis une methode native C#, donc pas=20
d'interop, aucun probleme (meme sans utiliser Thread.Sleep(1)...), tout=20
reste tres 'smooth' au niveau de l'interface.
Qui a une piste pour effectuer un appel d'une couteuse fonction d'une=20
DLL ActiveX VB6, sans aucun ralentissement de la thread principale de=20
l'interface ?
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
Paul Bacelar
Votre composant VB6 est-il threadsafe. Moi, j'en doute. Essayez en ajoutant à la création de votre thread <CODE> m_WorkerThread.ApartmentState = ApartmentState.STA </CODE> -- Paul Bacelar
"Cybertof" wrote in message news: Bonjour,
Y-t-il un bon moyen pour appeler une fonction d'une classe VB6 contenue dans un activex dll, via une thread c# ?
Je m'explique :
J'ai une classe CInteropCall qui encapsule un appel vers une methode de classe VB6 via une DLL Active X. La grosse fonction s'appelle FillAlloc_ArrayStruct_Double(), qui alloue un enorme tableau de structure via une boucle interne (for i = 1 to 300000...)
J'appelle cette longue fonction via une thread depuis ma forme princpale UI :
Voici la methode TestMe() de la classe CInteropCall qui appelle la methode VB6 via une instance de classe de l'activex dll ("interopé") :
public void TestMe() { AX_DLL.FillAlloc_ArrayStruct_Double(3000000, ref array_struct_double); }
Le probleme est le suivant : Mon interface se bloque lors du demarrage de la thread, puis rend la main à la fenetre principale tout en s'executant en background, mais se rebloque de temps en temps pendant l'execution.
J'a testé : - ajout de Sleep(1) dans la boucle interne de la fonction VB6. Pas de grand changement. - ajout DoEvents() dans la boucle interne de la fonction VB6. Pas de grand changement, mais ralenti le temps d'execution de la thread.
En faisant la routine de test depuis une methode native C#, donc pas d'interop, aucun probleme (meme sans utiliser Thread.Sleep(1)...), tout reste tres 'smooth' au niveau de l'interface.
Qui a une piste pour effectuer un appel d'une couteuse fonction d'une DLL ActiveX VB6, sans aucun ralentissement de la thread principale de l'interface ?
Merci.
Cybertof.
Votre composant VB6 est-il threadsafe. Moi, j'en doute.
Essayez en ajoutant à la création de votre thread
<CODE>
m_WorkerThread.ApartmentState = ApartmentState.STA
</CODE>
--
Paul Bacelar
"Cybertof" <cybertofNOSPAM@ifrance.com> wrote in message
news:MPG.1cd8814af24f60ee98968f@news.wanadoo.fr...
Bonjour,
Y-t-il un bon moyen pour appeler une fonction d'une classe VB6 contenue
dans un activex dll, via une thread c# ?
Je m'explique :
J'ai une classe CInteropCall qui encapsule un appel vers une methode de
classe VB6 via une DLL Active X.
La grosse fonction s'appelle FillAlloc_ArrayStruct_Double(), qui alloue
un enorme tableau de structure via une boucle interne (for i = 1 to
300000...)
J'appelle cette longue fonction via une thread depuis ma forme princpale
UI :
Voici la methode TestMe() de la classe CInteropCall qui appelle la
methode VB6 via une instance de classe de l'activex dll ("interopé") :
public void TestMe()
{
AX_DLL.FillAlloc_ArrayStruct_Double(3000000, ref array_struct_double);
}
Le probleme est le suivant :
Mon interface se bloque lors du demarrage de la thread, puis rend la
main à la fenetre principale tout en s'executant en background, mais se
rebloque de temps en temps pendant l'execution.
J'a testé :
- ajout de Sleep(1) dans la boucle interne de la fonction VB6.
Pas de grand changement.
- ajout DoEvents() dans la boucle interne de la fonction VB6.
Pas de grand changement, mais ralenti le temps d'execution de la thread.
En faisant la routine de test depuis une methode native C#, donc pas
d'interop, aucun probleme (meme sans utiliser Thread.Sleep(1)...), tout
reste tres 'smooth' au niveau de l'interface.
Qui a une piste pour effectuer un appel d'une couteuse fonction d'une
DLL ActiveX VB6, sans aucun ralentissement de la thread principale de
l'interface ?
Votre composant VB6 est-il threadsafe. Moi, j'en doute. Essayez en ajoutant à la création de votre thread <CODE> m_WorkerThread.ApartmentState = ApartmentState.STA </CODE> -- Paul Bacelar
"Cybertof" wrote in message news: Bonjour,
Y-t-il un bon moyen pour appeler une fonction d'une classe VB6 contenue dans un activex dll, via une thread c# ?
Je m'explique :
J'ai une classe CInteropCall qui encapsule un appel vers une methode de classe VB6 via une DLL Active X. La grosse fonction s'appelle FillAlloc_ArrayStruct_Double(), qui alloue un enorme tableau de structure via une boucle interne (for i = 1 to 300000...)
J'appelle cette longue fonction via une thread depuis ma forme princpale UI :
Voici la methode TestMe() de la classe CInteropCall qui appelle la methode VB6 via une instance de classe de l'activex dll ("interopé") :
public void TestMe() { AX_DLL.FillAlloc_ArrayStruct_Double(3000000, ref array_struct_double); }
Le probleme est le suivant : Mon interface se bloque lors du demarrage de la thread, puis rend la main à la fenetre principale tout en s'executant en background, mais se rebloque de temps en temps pendant l'execution.
J'a testé : - ajout de Sleep(1) dans la boucle interne de la fonction VB6. Pas de grand changement. - ajout DoEvents() dans la boucle interne de la fonction VB6. Pas de grand changement, mais ralenti le temps d'execution de la thread.
En faisant la routine de test depuis une methode native C#, donc pas d'interop, aucun probleme (meme sans utiliser Thread.Sleep(1)...), tout reste tres 'smooth' au niveau de l'interface.
Qui a une piste pour effectuer un appel d'une couteuse fonction d'une DLL ActiveX VB6, sans aucun ralentissement de la thread principale de l'interface ?
Merci.
Cybertof.
Paul Bacelar
Votre composant VB6 est-il threadsafe. Moi, j'en doute. Essayez en ajoutant à la création de votre thread <CODE> m_WorkerThread.ApartmentState = ApartmentState.STA </CODE> -- Paul Bacelar
"Cybertof" wrote in message news: Bonjour,
Y-t-il un bon moyen pour appeler une fonction d'une classe VB6 contenue dans un activex dll, via une thread c# ?
Je m'explique :
J'ai une classe CInteropCall qui encapsule un appel vers une methode de classe VB6 via une DLL Active X. La grosse fonction s'appelle FillAlloc_ArrayStruct_Double(), qui alloue un enorme tableau de structure via une boucle interne (for i = 1 to 300000...)
J'appelle cette longue fonction via une thread depuis ma forme princpale UI :
Voici la methode TestMe() de la classe CInteropCall qui appelle la methode VB6 via une instance de classe de l'activex dll ("interopé") :
public void TestMe() { AX_DLL.FillAlloc_ArrayStruct_Double(3000000, ref array_struct_double); }
Le probleme est le suivant : Mon interface se bloque lors du demarrage de la thread, puis rend la main à la fenetre principale tout en s'executant en background, mais se rebloque de temps en temps pendant l'execution.
J'a testé : - ajout de Sleep(1) dans la boucle interne de la fonction VB6. Pas de grand changement. - ajout DoEvents() dans la boucle interne de la fonction VB6. Pas de grand changement, mais ralenti le temps d'execution de la thread.
En faisant la routine de test depuis une methode native C#, donc pas d'interop, aucun probleme (meme sans utiliser Thread.Sleep(1)...), tout reste tres 'smooth' au niveau de l'interface.
Qui a une piste pour effectuer un appel d'une couteuse fonction d'une DLL ActiveX VB6, sans aucun ralentissement de la thread principale de l'interface ?
Merci.
Cybertof.
Votre composant VB6 est-il threadsafe. Moi, j'en doute.
Essayez en ajoutant à la création de votre thread
<CODE>
m_WorkerThread.ApartmentState = ApartmentState.STA
</CODE>
--
Paul Bacelar
"Cybertof" <cybertofNOSPAM@ifrance.com> wrote in message
news:MPG.1cd8814af24f60ee98968f@news.wanadoo.fr...
Bonjour,
Y-t-il un bon moyen pour appeler une fonction d'une classe VB6 contenue
dans un activex dll, via une thread c# ?
Je m'explique :
J'ai une classe CInteropCall qui encapsule un appel vers une methode de
classe VB6 via une DLL Active X.
La grosse fonction s'appelle FillAlloc_ArrayStruct_Double(), qui alloue
un enorme tableau de structure via une boucle interne (for i = 1 to
300000...)
J'appelle cette longue fonction via une thread depuis ma forme princpale
UI :
Voici la methode TestMe() de la classe CInteropCall qui appelle la
methode VB6 via une instance de classe de l'activex dll ("interopé") :
public void TestMe()
{
AX_DLL.FillAlloc_ArrayStruct_Double(3000000, ref array_struct_double);
}
Le probleme est le suivant :
Mon interface se bloque lors du demarrage de la thread, puis rend la
main à la fenetre principale tout en s'executant en background, mais se
rebloque de temps en temps pendant l'execution.
J'a testé :
- ajout de Sleep(1) dans la boucle interne de la fonction VB6.
Pas de grand changement.
- ajout DoEvents() dans la boucle interne de la fonction VB6.
Pas de grand changement, mais ralenti le temps d'execution de la thread.
En faisant la routine de test depuis une methode native C#, donc pas
d'interop, aucun probleme (meme sans utiliser Thread.Sleep(1)...), tout
reste tres 'smooth' au niveau de l'interface.
Qui a une piste pour effectuer un appel d'une couteuse fonction d'une
DLL ActiveX VB6, sans aucun ralentissement de la thread principale de
l'interface ?
Votre composant VB6 est-il threadsafe. Moi, j'en doute. Essayez en ajoutant à la création de votre thread <CODE> m_WorkerThread.ApartmentState = ApartmentState.STA </CODE> -- Paul Bacelar
"Cybertof" wrote in message news: Bonjour,
Y-t-il un bon moyen pour appeler une fonction d'une classe VB6 contenue dans un activex dll, via une thread c# ?
Je m'explique :
J'ai une classe CInteropCall qui encapsule un appel vers une methode de classe VB6 via une DLL Active X. La grosse fonction s'appelle FillAlloc_ArrayStruct_Double(), qui alloue un enorme tableau de structure via une boucle interne (for i = 1 to 300000...)
J'appelle cette longue fonction via une thread depuis ma forme princpale UI :
Voici la methode TestMe() de la classe CInteropCall qui appelle la methode VB6 via une instance de classe de l'activex dll ("interopé") :
public void TestMe() { AX_DLL.FillAlloc_ArrayStruct_Double(3000000, ref array_struct_double); }
Le probleme est le suivant : Mon interface se bloque lors du demarrage de la thread, puis rend la main à la fenetre principale tout en s'executant en background, mais se rebloque de temps en temps pendant l'execution.
J'a testé : - ajout de Sleep(1) dans la boucle interne de la fonction VB6. Pas de grand changement. - ajout DoEvents() dans la boucle interne de la fonction VB6. Pas de grand changement, mais ralenti le temps d'execution de la thread.
En faisant la routine de test depuis une methode native C#, donc pas d'interop, aucun probleme (meme sans utiliser Thread.Sleep(1)...), tout reste tres 'smooth' au niveau de l'interface.
Qui a une piste pour effectuer un appel d'une couteuse fonction d'une DLL ActiveX VB6, sans aucun ralentissement de la thread principale de l'interface ?
Merci.
Cybertof.
Paul Bacelar
Votre composant VB6 est-il threadsafe. Moi, j'en doute. Essayez en ajoutant à la création de votre thread <CODE> m_WorkerThread.ApartmentState = ApartmentState.STA </CODE> -- Paul Bacelar
"Cybertof" wrote in message news: Bonjour,
Y-t-il un bon moyen pour appeler une fonction d'une classe VB6 contenue dans un activex dll, via une thread c# ?
Je m'explique :
J'ai une classe CInteropCall qui encapsule un appel vers une methode de classe VB6 via une DLL Active X. La grosse fonction s'appelle FillAlloc_ArrayStruct_Double(), qui alloue un enorme tableau de structure via une boucle interne (for i = 1 to 300000...)
J'appelle cette longue fonction via une thread depuis ma forme princpale UI :
Voici la methode TestMe() de la classe CInteropCall qui appelle la methode VB6 via une instance de classe de l'activex dll ("interopé") :
public void TestMe() { AX_DLL.FillAlloc_ArrayStruct_Double(3000000, ref array_struct_double); }
Le probleme est le suivant : Mon interface se bloque lors du demarrage de la thread, puis rend la main à la fenetre principale tout en s'executant en background, mais se rebloque de temps en temps pendant l'execution.
J'a testé : - ajout de Sleep(1) dans la boucle interne de la fonction VB6. Pas de grand changement. - ajout DoEvents() dans la boucle interne de la fonction VB6. Pas de grand changement, mais ralenti le temps d'execution de la thread.
En faisant la routine de test depuis une methode native C#, donc pas d'interop, aucun probleme (meme sans utiliser Thread.Sleep(1)...), tout reste tres 'smooth' au niveau de l'interface.
Qui a une piste pour effectuer un appel d'une couteuse fonction d'une DLL ActiveX VB6, sans aucun ralentissement de la thread principale de l'interface ?
Merci.
Cybertof.
Votre composant VB6 est-il threadsafe. Moi, j'en doute.
Essayez en ajoutant à la création de votre thread
<CODE>
m_WorkerThread.ApartmentState = ApartmentState.STA
</CODE>
--
Paul Bacelar
"Cybertof" <cybertofNOSPAM@ifrance.com> wrote in message
news:MPG.1cd8814af24f60ee98968f@news.wanadoo.fr...
Bonjour,
Y-t-il un bon moyen pour appeler une fonction d'une classe VB6 contenue
dans un activex dll, via une thread c# ?
Je m'explique :
J'ai une classe CInteropCall qui encapsule un appel vers une methode de
classe VB6 via une DLL Active X.
La grosse fonction s'appelle FillAlloc_ArrayStruct_Double(), qui alloue
un enorme tableau de structure via une boucle interne (for i = 1 to
300000...)
J'appelle cette longue fonction via une thread depuis ma forme princpale
UI :
Voici la methode TestMe() de la classe CInteropCall qui appelle la
methode VB6 via une instance de classe de l'activex dll ("interopé") :
public void TestMe()
{
AX_DLL.FillAlloc_ArrayStruct_Double(3000000, ref array_struct_double);
}
Le probleme est le suivant :
Mon interface se bloque lors du demarrage de la thread, puis rend la
main à la fenetre principale tout en s'executant en background, mais se
rebloque de temps en temps pendant l'execution.
J'a testé :
- ajout de Sleep(1) dans la boucle interne de la fonction VB6.
Pas de grand changement.
- ajout DoEvents() dans la boucle interne de la fonction VB6.
Pas de grand changement, mais ralenti le temps d'execution de la thread.
En faisant la routine de test depuis une methode native C#, donc pas
d'interop, aucun probleme (meme sans utiliser Thread.Sleep(1)...), tout
reste tres 'smooth' au niveau de l'interface.
Qui a une piste pour effectuer un appel d'une couteuse fonction d'une
DLL ActiveX VB6, sans aucun ralentissement de la thread principale de
l'interface ?
Votre composant VB6 est-il threadsafe. Moi, j'en doute. Essayez en ajoutant à la création de votre thread <CODE> m_WorkerThread.ApartmentState = ApartmentState.STA </CODE> -- Paul Bacelar
"Cybertof" wrote in message news: Bonjour,
Y-t-il un bon moyen pour appeler une fonction d'une classe VB6 contenue dans un activex dll, via une thread c# ?
Je m'explique :
J'ai une classe CInteropCall qui encapsule un appel vers une methode de classe VB6 via une DLL Active X. La grosse fonction s'appelle FillAlloc_ArrayStruct_Double(), qui alloue un enorme tableau de structure via une boucle interne (for i = 1 to 300000...)
J'appelle cette longue fonction via une thread depuis ma forme princpale UI :
Voici la methode TestMe() de la classe CInteropCall qui appelle la methode VB6 via une instance de classe de l'activex dll ("interopé") :
public void TestMe() { AX_DLL.FillAlloc_ArrayStruct_Double(3000000, ref array_struct_double); }
Le probleme est le suivant : Mon interface se bloque lors du demarrage de la thread, puis rend la main à la fenetre principale tout en s'executant en background, mais se rebloque de temps en temps pendant l'execution.
J'a testé : - ajout de Sleep(1) dans la boucle interne de la fonction VB6. Pas de grand changement. - ajout DoEvents() dans la boucle interne de la fonction VB6. Pas de grand changement, mais ralenti le temps d'execution de la thread.
En faisant la routine de test depuis une methode native C#, donc pas d'interop, aucun probleme (meme sans utiliser Thread.Sleep(1)...), tout reste tres 'smooth' au niveau de l'interface.
Qui a une piste pour effectuer un appel d'une couteuse fonction d'une DLL ActiveX VB6, sans aucun ralentissement de la thread principale de l'interface ?
Merci.
Cybertof.
Cybertof
In article , says...
Votre composant VB6 est-il threadsafe. Moi, j'en doute. Essayez en ajoutant à la création de votre thread <CODE> m_WorkerThread.ApartmentState = ApartmentState.STA </CODE>
Bonjour,
Ca ne change pas grand chose.
Tout le temps perdu est lors du passage du tableau en argument.
In article <uRRxZPvSFHA.3244@TK2MSFTNGP15.phx.gbl>,
paul.bacelar@PASDESPAMlaposte.net says...
Votre composant VB6 est-il threadsafe. Moi, j'en doute.
Essayez en ajoutant à la création de votre thread
<CODE>
m_WorkerThread.ApartmentState = ApartmentState.STA
</CODE>
Bonjour,
Ca ne change pas grand chose.
Tout le temps perdu est lors du passage du tableau en argument.
Votre composant VB6 est-il threadsafe. Moi, j'en doute. Essayez en ajoutant à la création de votre thread <CODE> m_WorkerThread.ApartmentState = ApartmentState.STA </CODE>
Bonjour,
Ca ne change pas grand chose.
Tout le temps perdu est lors du passage du tableau en argument.
Paul Bacelar
"Cybertof" wrote in message news: In article , says...
Votre composant VB6 est-il threadsafe. Moi, j'en doute. Essayez en ajoutant à la création de votre thread <CODE> m_WorkerThread.ApartmentState = ApartmentState.STA </CODE>
Bonjour,
Ca ne change pas grand chose.
Tout le temps perdu est lors du passage du tableau en argument.
En êtes-vous sûr, l'utilisation d'un profiler est indispensable pour tirer ce genre de constatation. Si c'est l'ActiveX qui alloue, pourquoi ne pas passer l'argument en "out" et pas en ref.
AX_DLL.FillAlloc_ArrayStruct_Double(3000000, out array_struct_double);
-- Paul Bacelar
"Cybertof" <cybertofNOSPAM@ifrance.com> wrote in message
news:MPG.1cd9596ab7b645a0989692@news.wanadoo.fr...
In article <uRRxZPvSFHA.3244@TK2MSFTNGP15.phx.gbl>,
paul.bacelar@PASDESPAMlaposte.net says...
Votre composant VB6 est-il threadsafe. Moi, j'en doute.
Essayez en ajoutant à la création de votre thread
<CODE>
m_WorkerThread.ApartmentState = ApartmentState.STA
</CODE>
Bonjour,
Ca ne change pas grand chose.
Tout le temps perdu est lors du passage du tableau en argument.
En êtes-vous sûr, l'utilisation d'un profiler est indispensable pour tirer
ce genre de constatation.
Si c'est l'ActiveX qui alloue, pourquoi ne pas passer l'argument en "out" et
pas en ref.
AX_DLL.FillAlloc_ArrayStruct_Double(3000000, out array_struct_double);
"Cybertof" wrote in message news: In article , says...
Votre composant VB6 est-il threadsafe. Moi, j'en doute. Essayez en ajoutant à la création de votre thread <CODE> m_WorkerThread.ApartmentState = ApartmentState.STA </CODE>
Bonjour,
Ca ne change pas grand chose.
Tout le temps perdu est lors du passage du tableau en argument.
En êtes-vous sûr, l'utilisation d'un profiler est indispensable pour tirer ce genre de constatation. Si c'est l'ActiveX qui alloue, pourquoi ne pas passer l'argument en "out" et pas en ref.
AX_DLL.FillAlloc_ArrayStruct_Double(3000000, out array_struct_double);