bonjour,
je veux capturer a intervalle regulier une image a partir du flux de
webcam
renvoyé
j'arrive a recuperer le flux de la camera sans probleme mais des que
j'appel
la mehode de capture j'ai une cast exception :
voici la methode :
public void captImg(){
int hr;
Trace.WriteLine("!!BTN: toolBarBtnGrab");
if (savedArray == null)
{
int size = videoInfoHeader.BmiHeader.ImageSize;
if ((size < 1000) || (size > 16000000))
return;
savedArray = new byte[size + 64000];
}
// toolBarBtnSave.Enabled = false;
Image old = pictureBox1.Image;
pictureBox1.Image = null;
if (old != null)
old.Dispose();
// toolBarBtnGrab.Enabled = false;
captured = false;
//MessageBox.Show(""+this);
hr = sampGrabber.SetCallback(this, 0); => ligne fautive
}
apres voici l'autre methode :
int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int
BufferLen)
{
if (savedArray == null)
{
return 0;
}
if ((pBuffer != IntPtr.Zero) && (BufferLen > 1000) &&
(BufferLen <= savedArray.Length))
Marshal.Copy(pBuffer, savedArray, 0, BufferLen);
this.OnCaptureDone();
return 0;
}
ce qui me derange c'est que quand j'appel la methode a partir d'un boutton
ca marche impec mais des que je passe par un autre Thread pour appeler la
methode ca ne marche pas (par reference instancedemaform.captImg())
voila est ce que quelqu'un a eut le meme probleme ?
si oui comment le resoudre ?
merci
bonne soiree
bonjour,
je veux capturer a intervalle regulier une image a partir du flux de
webcam
renvoyé
j'arrive a recuperer le flux de la camera sans probleme mais des que
j'appel
la mehode de capture j'ai une cast exception :
voici la methode :
public void captImg(){
int hr;
Trace.WriteLine("!!BTN: toolBarBtnGrab");
if (savedArray == null)
{
int size = videoInfoHeader.BmiHeader.ImageSize;
if ((size < 1000) || (size > 16000000))
return;
savedArray = new byte[size + 64000];
}
// toolBarBtnSave.Enabled = false;
Image old = pictureBox1.Image;
pictureBox1.Image = null;
if (old != null)
old.Dispose();
// toolBarBtnGrab.Enabled = false;
captured = false;
//MessageBox.Show(""+this);
hr = sampGrabber.SetCallback(this, 0); => ligne fautive
}
apres voici l'autre methode :
int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int
BufferLen)
{
if (savedArray == null)
{
return 0;
}
if ((pBuffer != IntPtr.Zero) && (BufferLen > 1000) &&
(BufferLen <= savedArray.Length))
Marshal.Copy(pBuffer, savedArray, 0, BufferLen);
this.OnCaptureDone();
return 0;
}
ce qui me derange c'est que quand j'appel la methode a partir d'un boutton
ca marche impec mais des que je passe par un autre Thread pour appeler la
methode ca ne marche pas (par reference instancedemaform.captImg())
voila est ce que quelqu'un a eut le meme probleme ?
si oui comment le resoudre ?
merci
bonne soiree
bonjour,
je veux capturer a intervalle regulier une image a partir du flux de
webcam
renvoyé
j'arrive a recuperer le flux de la camera sans probleme mais des que
j'appel
la mehode de capture j'ai une cast exception :
voici la methode :
public void captImg(){
int hr;
Trace.WriteLine("!!BTN: toolBarBtnGrab");
if (savedArray == null)
{
int size = videoInfoHeader.BmiHeader.ImageSize;
if ((size < 1000) || (size > 16000000))
return;
savedArray = new byte[size + 64000];
}
// toolBarBtnSave.Enabled = false;
Image old = pictureBox1.Image;
pictureBox1.Image = null;
if (old != null)
old.Dispose();
// toolBarBtnGrab.Enabled = false;
captured = false;
//MessageBox.Show(""+this);
hr = sampGrabber.SetCallback(this, 0); => ligne fautive
}
apres voici l'autre methode :
int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int
BufferLen)
{
if (savedArray == null)
{
return 0;
}
if ((pBuffer != IntPtr.Zero) && (BufferLen > 1000) &&
(BufferLen <= savedArray.Length))
Marshal.Copy(pBuffer, savedArray, 0, BufferLen);
this.OnCaptureDone();
return 0;
}
ce qui me derange c'est que quand j'appel la methode a partir d'un boutton
ca marche impec mais des que je passe par un autre Thread pour appeler la
methode ca ne marche pas (par reference instancedemaform.captImg())
voila est ce que quelqu'un a eut le meme probleme ?
si oui comment le resoudre ?
merci
bonne soiree
"daedric" c'est ton pseudo?
http://www.developpez.net/forums/archive/index.php/t-168034.html
Si oui, t'étais bien plus précis il y a 1 mois ;-).
A en croire la trace dans le premier poste du lien, Mose donne une
explication des plus convaincante.
Pour expliquer la différence de comportement entre bouton et Thread, et sans
avoir l'intégralité du code, je pencherais pour un problème de composant COM
marqué comme STA (SigleThreadedAppartment) et que la classe proxy de ce
composant n'est pas enregistré sur la machine.
Peux-tu mettre à notre disposition une version du projet reproduisant le
problème et n'ayant pas besoin d'une camera (par l'utilisation de bouchon
utilisant un fichier image par exemple).
--
Paul Bacelar
MVP VC++
"Thomas" wrote in message
news:
> bonjour,
> je veux capturer a intervalle regulier une image a partir du flux de
> webcam
> renvoyé
> j'arrive a recuperer le flux de la camera sans probleme mais des que
> j'appel
> la mehode de capture j'ai une cast exception :
> voici la methode :
>
> public void captImg(){
>
> int hr;
> Trace.WriteLine("!!BTN: toolBarBtnGrab");
>
> if (savedArray == null)
> {
> int size = videoInfoHeader.BmiHeader.ImageSize;
> if ((size < 1000) || (size > 16000000))
> return;
> savedArray = new byte[size + 64000];
> }
>
> // toolBarBtnSave.Enabled = false;
> Image old = pictureBox1.Image;
> pictureBox1.Image = null;
> if (old != null)
> old.Dispose();
>
> // toolBarBtnGrab.Enabled = false;
> captured = false;
> //MessageBox.Show(""+this);
> hr = sampGrabber.SetCallback(this, 0); => ligne fautive
>
> }
>
> apres voici l'autre methode :
>
> int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int
> BufferLen)
> {
> if (savedArray == null)
> {
> return 0;
> }
>
> if ((pBuffer != IntPtr.Zero) && (BufferLen > 1000) &&
> (BufferLen <= savedArray.Length))
> Marshal.Copy(pBuffer, savedArray, 0, BufferLen);
>
> this.OnCaptureDone();
> return 0;
> }
>
>
> ce qui me derange c'est que quand j'appel la methode a partir d'un boutton
> ca marche impec mais des que je passe par un autre Thread pour appeler la
> methode ca ne marche pas (par reference instancedemaform.captImg())
>
> voila est ce que quelqu'un a eut le meme probleme ?
> si oui comment le resoudre ?
>
> merci
> bonne soiree
>
"daedric" c'est ton pseudo?
http://www.developpez.net/forums/archive/index.php/t-168034.html
Si oui, t'étais bien plus précis il y a 1 mois ;-).
A en croire la trace dans le premier poste du lien, Mose donne une
explication des plus convaincante.
Pour expliquer la différence de comportement entre bouton et Thread, et sans
avoir l'intégralité du code, je pencherais pour un problème de composant COM
marqué comme STA (SigleThreadedAppartment) et que la classe proxy de ce
composant n'est pas enregistré sur la machine.
Peux-tu mettre à notre disposition une version du projet reproduisant le
problème et n'ayant pas besoin d'une camera (par l'utilisation de bouchon
utilisant un fichier image par exemple).
--
Paul Bacelar
MVP VC++
"Thomas" <daedric@daedric.com> wrote in message
news:79E4B120-5FD1-4DA7-889D-8A36477A1E57@microsoft.com...
> bonjour,
> je veux capturer a intervalle regulier une image a partir du flux de
> webcam
> renvoyé
> j'arrive a recuperer le flux de la camera sans probleme mais des que
> j'appel
> la mehode de capture j'ai une cast exception :
> voici la methode :
>
> public void captImg(){
>
> int hr;
> Trace.WriteLine("!!BTN: toolBarBtnGrab");
>
> if (savedArray == null)
> {
> int size = videoInfoHeader.BmiHeader.ImageSize;
> if ((size < 1000) || (size > 16000000))
> return;
> savedArray = new byte[size + 64000];
> }
>
> // toolBarBtnSave.Enabled = false;
> Image old = pictureBox1.Image;
> pictureBox1.Image = null;
> if (old != null)
> old.Dispose();
>
> // toolBarBtnGrab.Enabled = false;
> captured = false;
> //MessageBox.Show(""+this);
> hr = sampGrabber.SetCallback(this, 0); => ligne fautive
>
> }
>
> apres voici l'autre methode :
>
> int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int
> BufferLen)
> {
> if (savedArray == null)
> {
> return 0;
> }
>
> if ((pBuffer != IntPtr.Zero) && (BufferLen > 1000) &&
> (BufferLen <= savedArray.Length))
> Marshal.Copy(pBuffer, savedArray, 0, BufferLen);
>
> this.OnCaptureDone();
> return 0;
> }
>
>
> ce qui me derange c'est que quand j'appel la methode a partir d'un boutton
> ca marche impec mais des que je passe par un autre Thread pour appeler la
> methode ca ne marche pas (par reference instancedemaform.captImg())
>
> voila est ce que quelqu'un a eut le meme probleme ?
> si oui comment le resoudre ?
>
> merci
> bonne soiree
>
"daedric" c'est ton pseudo?
http://www.developpez.net/forums/archive/index.php/t-168034.html
Si oui, t'étais bien plus précis il y a 1 mois ;-).
A en croire la trace dans le premier poste du lien, Mose donne une
explication des plus convaincante.
Pour expliquer la différence de comportement entre bouton et Thread, et sans
avoir l'intégralité du code, je pencherais pour un problème de composant COM
marqué comme STA (SigleThreadedAppartment) et que la classe proxy de ce
composant n'est pas enregistré sur la machine.
Peux-tu mettre à notre disposition une version du projet reproduisant le
problème et n'ayant pas besoin d'une camera (par l'utilisation de bouchon
utilisant un fichier image par exemple).
--
Paul Bacelar
MVP VC++
"Thomas" wrote in message
news:
> bonjour,
> je veux capturer a intervalle regulier une image a partir du flux de
> webcam
> renvoyé
> j'arrive a recuperer le flux de la camera sans probleme mais des que
> j'appel
> la mehode de capture j'ai une cast exception :
> voici la methode :
>
> public void captImg(){
>
> int hr;
> Trace.WriteLine("!!BTN: toolBarBtnGrab");
>
> if (savedArray == null)
> {
> int size = videoInfoHeader.BmiHeader.ImageSize;
> if ((size < 1000) || (size > 16000000))
> return;
> savedArray = new byte[size + 64000];
> }
>
> // toolBarBtnSave.Enabled = false;
> Image old = pictureBox1.Image;
> pictureBox1.Image = null;
> if (old != null)
> old.Dispose();
>
> // toolBarBtnGrab.Enabled = false;
> captured = false;
> //MessageBox.Show(""+this);
> hr = sampGrabber.SetCallback(this, 0); => ligne fautive
>
> }
>
> apres voici l'autre methode :
>
> int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int
> BufferLen)
> {
> if (savedArray == null)
> {
> return 0;
> }
>
> if ((pBuffer != IntPtr.Zero) && (BufferLen > 1000) &&
> (BufferLen <= savedArray.Length))
> Marshal.Copy(pBuffer, savedArray, 0, BufferLen);
>
> this.OnCaptureDone();
> return 0;
> }
>
>
> ce qui me derange c'est que quand j'appel la methode a partir d'un boutton
> ca marche impec mais des que je passe par un autre Thread pour appeler la
> methode ca ne marche pas (par reference instancedemaform.captImg())
>
> voila est ce que quelqu'un a eut le meme probleme ?
> si oui comment le resoudre ?
>
> merci
> bonne soiree
>
pour le morceau de code je ne crois pas etant donne que c'est la capture
qui
deconne particulierement et que je peut demarre la preview a partir d'une
autre classe...
sinon je vois pas tres bien ce que tu veux dire par classe proxy ... une
dll
?
si oui je suppose qu'il faut l'enregistrer par regsvr32
enfin je vais faire un petit tour sur google voir ce que tu voulais dire
...
merci encore une fois ;) il y a bien un des deux composant qui feras ce
que
je demande ...
"Paul Bacelar" wrote:"daedric" c'est ton pseudo?
http://www.developpez.net/forums/archive/index.php/t-168034.html
Si oui, t'étais bien plus précis il y a 1 mois ;-).
A en croire la trace dans le premier poste du lien, Mose donne une
explication des plus convaincante.
Pour expliquer la différence de comportement entre bouton et Thread, et
sans
avoir l'intégralité du code, je pencherais pour un problème de composant
COM
marqué comme STA (SigleThreadedAppartment) et que la classe proxy de ce
composant n'est pas enregistré sur la machine.
Peux-tu mettre à notre disposition une version du projet reproduisant le
problème et n'ayant pas besoin d'une camera (par l'utilisation de bouchon
utilisant un fichier image par exemple).
--
Paul Bacelar
MVP VC++
"Thomas" wrote in message
news:
> bonjour,
> je veux capturer a intervalle regulier une image a partir du flux de
> webcam
> renvoyé
> j'arrive a recuperer le flux de la camera sans probleme mais des que
> j'appel
> la mehode de capture j'ai une cast exception :
> voici la methode :
>
> public void captImg(){
>
> int hr;
> Trace.WriteLine("!!BTN: toolBarBtnGrab");
>
> if (savedArray == null)
> {
> int size = videoInfoHeader.BmiHeader.ImageSize;
> if ((size < 1000) || (size > 16000000))
> return;
> savedArray = new byte[size + 64000];
> }
>
> // toolBarBtnSave.Enabled = false;
> Image old = pictureBox1.Image;
> pictureBox1.Image = null;
> if (old != null)
> old.Dispose();
>
> // toolBarBtnGrab.Enabled = false;
> captured = false;
> //MessageBox.Show(""+this);
> hr = sampGrabber.SetCallback(this, 0); => ligne fautive
>
> }
>
> apres voici l'autre methode :
>
> int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int
> BufferLen)
> {
> if (savedArray == null)
> {
> return 0;
> }
>
> if ((pBuffer != IntPtr.Zero) && (BufferLen > 1000) &&
> (BufferLen <= savedArray.Length))
> Marshal.Copy(pBuffer, savedArray, 0, BufferLen);
>
> this.OnCaptureDone();
> return 0;
> }
>
>
> ce qui me derange c'est que quand j'appel la methode a partir d'un
> boutton
> ca marche impec mais des que je passe par un autre Thread pour appeler
> la
> methode ca ne marche pas (par reference instancedemaform.captImg())
>
> voila est ce que quelqu'un a eut le meme probleme ?
> si oui comment le resoudre ?
>
> merci
> bonne soiree
>
pour le morceau de code je ne crois pas etant donne que c'est la capture
qui
deconne particulierement et que je peut demarre la preview a partir d'une
autre classe...
sinon je vois pas tres bien ce que tu veux dire par classe proxy ... une
dll
?
si oui je suppose qu'il faut l'enregistrer par regsvr32
enfin je vais faire un petit tour sur google voir ce que tu voulais dire
...
merci encore une fois ;) il y a bien un des deux composant qui feras ce
que
je demande ...
"Paul Bacelar" wrote:
"daedric" c'est ton pseudo?
http://www.developpez.net/forums/archive/index.php/t-168034.html
Si oui, t'étais bien plus précis il y a 1 mois ;-).
A en croire la trace dans le premier poste du lien, Mose donne une
explication des plus convaincante.
Pour expliquer la différence de comportement entre bouton et Thread, et
sans
avoir l'intégralité du code, je pencherais pour un problème de composant
COM
marqué comme STA (SigleThreadedAppartment) et que la classe proxy de ce
composant n'est pas enregistré sur la machine.
Peux-tu mettre à notre disposition une version du projet reproduisant le
problème et n'ayant pas besoin d'une camera (par l'utilisation de bouchon
utilisant un fichier image par exemple).
--
Paul Bacelar
MVP VC++
"Thomas" <daedric@daedric.com> wrote in message
news:79E4B120-5FD1-4DA7-889D-8A36477A1E57@microsoft.com...
> bonjour,
> je veux capturer a intervalle regulier une image a partir du flux de
> webcam
> renvoyé
> j'arrive a recuperer le flux de la camera sans probleme mais des que
> j'appel
> la mehode de capture j'ai une cast exception :
> voici la methode :
>
> public void captImg(){
>
> int hr;
> Trace.WriteLine("!!BTN: toolBarBtnGrab");
>
> if (savedArray == null)
> {
> int size = videoInfoHeader.BmiHeader.ImageSize;
> if ((size < 1000) || (size > 16000000))
> return;
> savedArray = new byte[size + 64000];
> }
>
> // toolBarBtnSave.Enabled = false;
> Image old = pictureBox1.Image;
> pictureBox1.Image = null;
> if (old != null)
> old.Dispose();
>
> // toolBarBtnGrab.Enabled = false;
> captured = false;
> //MessageBox.Show(""+this);
> hr = sampGrabber.SetCallback(this, 0); => ligne fautive
>
> }
>
> apres voici l'autre methode :
>
> int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int
> BufferLen)
> {
> if (savedArray == null)
> {
> return 0;
> }
>
> if ((pBuffer != IntPtr.Zero) && (BufferLen > 1000) &&
> (BufferLen <= savedArray.Length))
> Marshal.Copy(pBuffer, savedArray, 0, BufferLen);
>
> this.OnCaptureDone();
> return 0;
> }
>
>
> ce qui me derange c'est que quand j'appel la methode a partir d'un
> boutton
> ca marche impec mais des que je passe par un autre Thread pour appeler
> la
> methode ca ne marche pas (par reference instancedemaform.captImg())
>
> voila est ce que quelqu'un a eut le meme probleme ?
> si oui comment le resoudre ?
>
> merci
> bonne soiree
>
pour le morceau de code je ne crois pas etant donne que c'est la capture
qui
deconne particulierement et que je peut demarre la preview a partir d'une
autre classe...
sinon je vois pas tres bien ce que tu veux dire par classe proxy ... une
dll
?
si oui je suppose qu'il faut l'enregistrer par regsvr32
enfin je vais faire un petit tour sur google voir ce que tu voulais dire
...
merci encore une fois ;) il y a bien un des deux composant qui feras ce
que
je demande ...
"Paul Bacelar" wrote:"daedric" c'est ton pseudo?
http://www.developpez.net/forums/archive/index.php/t-168034.html
Si oui, t'étais bien plus précis il y a 1 mois ;-).
A en croire la trace dans le premier poste du lien, Mose donne une
explication des plus convaincante.
Pour expliquer la différence de comportement entre bouton et Thread, et
sans
avoir l'intégralité du code, je pencherais pour un problème de composant
COM
marqué comme STA (SigleThreadedAppartment) et que la classe proxy de ce
composant n'est pas enregistré sur la machine.
Peux-tu mettre à notre disposition une version du projet reproduisant le
problème et n'ayant pas besoin d'une camera (par l'utilisation de bouchon
utilisant un fichier image par exemple).
--
Paul Bacelar
MVP VC++
"Thomas" wrote in message
news:
> bonjour,
> je veux capturer a intervalle regulier une image a partir du flux de
> webcam
> renvoyé
> j'arrive a recuperer le flux de la camera sans probleme mais des que
> j'appel
> la mehode de capture j'ai une cast exception :
> voici la methode :
>
> public void captImg(){
>
> int hr;
> Trace.WriteLine("!!BTN: toolBarBtnGrab");
>
> if (savedArray == null)
> {
> int size = videoInfoHeader.BmiHeader.ImageSize;
> if ((size < 1000) || (size > 16000000))
> return;
> savedArray = new byte[size + 64000];
> }
>
> // toolBarBtnSave.Enabled = false;
> Image old = pictureBox1.Image;
> pictureBox1.Image = null;
> if (old != null)
> old.Dispose();
>
> // toolBarBtnGrab.Enabled = false;
> captured = false;
> //MessageBox.Show(""+this);
> hr = sampGrabber.SetCallback(this, 0); => ligne fautive
>
> }
>
> apres voici l'autre methode :
>
> int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int
> BufferLen)
> {
> if (savedArray == null)
> {
> return 0;
> }
>
> if ((pBuffer != IntPtr.Zero) && (BufferLen > 1000) &&
> (BufferLen <= savedArray.Length))
> Marshal.Copy(pBuffer, savedArray, 0, BufferLen);
>
> this.OnCaptureDone();
> return 0;
> }
>
>
> ce qui me derange c'est que quand j'appel la methode a partir d'un
> boutton
> ca marche impec mais des que je passe par un autre Thread pour appeler
> la
> methode ca ne marche pas (par reference instancedemaform.captImg())
>
> voila est ce que quelqu'un a eut le meme probleme ?
> si oui comment le resoudre ?
>
> merci
> bonne soiree
>
Pour vérifier que le problème est bien un problème d'appartment COM,
pouvez-vous vérifier avec Thread.GetApartmentState()
(http://msdn2.microsoft.com/en-us/library/system.threading.thread.getapartmentstate.aspx)
que l'appel via le bouton et l'appel via un workingThread ne dispose pas des
mêmes environnement COM.
Si c'est bien le cas, le problème pourrais être résolu en utilisant un appel
à Thread.SetApartmentState() dans le workingThread.
Nous attendons votre feedback.
--
Paul Bacelar
MVP VC++
"Thomas" wrote in message
news:
> pour le morceau de code je ne crois pas etant donne que c'est la capture
> qui
> deconne particulierement et que je peut demarre la preview a partir d'une
> autre classe...
>
> sinon je vois pas tres bien ce que tu veux dire par classe proxy ... une
> dll
> ?
> si oui je suppose qu'il faut l'enregistrer par regsvr32
>
> enfin je vais faire un petit tour sur google voir ce que tu voulais dire
> ...
>
> merci encore une fois ;) il y a bien un des deux composant qui feras ce
> que
> je demande ...
> "Paul Bacelar" wrote:
>
>> "daedric" c'est ton pseudo?
>>
>> http://www.developpez.net/forums/archive/index.php/t-168034.html
>>
>> Si oui, t'étais bien plus précis il y a 1 mois ;-).
>>
>> A en croire la trace dans le premier poste du lien, Mose donne une
>> explication des plus convaincante.
>>
>> Pour expliquer la différence de comportement entre bouton et Thread, et
>> sans
>> avoir l'intégralité du code, je pencherais pour un problème de composant
>> COM
>> marqué comme STA (SigleThreadedAppartment) et que la classe proxy de ce
>> composant n'est pas enregistré sur la machine.
>>
>> Peux-tu mettre à notre disposition une version du projet reproduisant le
>> problème et n'ayant pas besoin d'une camera (par l'utilisation de bouchon
>> utilisant un fichier image par exemple).
>> --
>> Paul Bacelar
>> MVP VC++
>>
>>
>> "Thomas" wrote in message
>> news:
>> > bonjour,
>> > je veux capturer a intervalle regulier une image a partir du flux de
>> > webcam
>> > renvoyé
>> > j'arrive a recuperer le flux de la camera sans probleme mais des que
>> > j'appel
>> > la mehode de capture j'ai une cast exception :
>> > voici la methode :
>> >
>> > public void captImg(){
>> >
>> > int hr;
>> > Trace.WriteLine("!!BTN: toolBarBtnGrab");
>> >
>> > if (savedArray == null)
>> > {
>> > int size = videoInfoHeader.BmiHeader.ImageSize;
>> > if ((size < 1000) || (size > 16000000))
>> > return;
>> > savedArray = new byte[size + 64000];
>> > }
>> >
>> > // toolBarBtnSave.Enabled = false;
>> > Image old = pictureBox1.Image;
>> > pictureBox1.Image = null;
>> > if (old != null)
>> > old.Dispose();
>> >
>> > // toolBarBtnGrab.Enabled = false;
>> > captured = false;
>> > //MessageBox.Show(""+this);
>> > hr = sampGrabber.SetCallback(this, 0); => ligne fautive
>> >
>> > }
>> >
>> > apres voici l'autre methode :
>> >
>> > int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int
>> > BufferLen)
>> > {
>> > if (savedArray == null)
>> > {
>> > return 0;
>> > }
>> >
>> > if ((pBuffer != IntPtr.Zero) && (BufferLen > 1000) &&
>> > (BufferLen <= savedArray.Length))
>> > Marshal.Copy(pBuffer, savedArray, 0, BufferLen);
>> >
>> > this.OnCaptureDone();
>> > return 0;
>> > }
>> >
>> >
>> > ce qui me derange c'est que quand j'appel la methode a partir d'un
>> > boutton
>> > ca marche impec mais des que je passe par un autre Thread pour appeler
>> > la
>> > methode ca ne marche pas (par reference instancedemaform.captImg())
>> >
>> > voila est ce que quelqu'un a eut le meme probleme ?
>> > si oui comment le resoudre ?
>> >
>> > merci
>> > bonne soiree
>> >
>>
>>
>>
Pour vérifier que le problème est bien un problème d'appartment COM,
pouvez-vous vérifier avec Thread.GetApartmentState()
(http://msdn2.microsoft.com/en-us/library/system.threading.thread.getapartmentstate.aspx)
que l'appel via le bouton et l'appel via un workingThread ne dispose pas des
mêmes environnement COM.
Si c'est bien le cas, le problème pourrais être résolu en utilisant un appel
à Thread.SetApartmentState() dans le workingThread.
Nous attendons votre feedback.
--
Paul Bacelar
MVP VC++
"Thomas" <daedric@daedric.com> wrote in message
news:5B9B762E-70E4-4489-97BA-2706A711FFF1@microsoft.com...
> pour le morceau de code je ne crois pas etant donne que c'est la capture
> qui
> deconne particulierement et que je peut demarre la preview a partir d'une
> autre classe...
>
> sinon je vois pas tres bien ce que tu veux dire par classe proxy ... une
> dll
> ?
> si oui je suppose qu'il faut l'enregistrer par regsvr32
>
> enfin je vais faire un petit tour sur google voir ce que tu voulais dire
> ...
>
> merci encore une fois ;) il y a bien un des deux composant qui feras ce
> que
> je demande ...
> "Paul Bacelar" wrote:
>
>> "daedric" c'est ton pseudo?
>>
>> http://www.developpez.net/forums/archive/index.php/t-168034.html
>>
>> Si oui, t'étais bien plus précis il y a 1 mois ;-).
>>
>> A en croire la trace dans le premier poste du lien, Mose donne une
>> explication des plus convaincante.
>>
>> Pour expliquer la différence de comportement entre bouton et Thread, et
>> sans
>> avoir l'intégralité du code, je pencherais pour un problème de composant
>> COM
>> marqué comme STA (SigleThreadedAppartment) et que la classe proxy de ce
>> composant n'est pas enregistré sur la machine.
>>
>> Peux-tu mettre à notre disposition une version du projet reproduisant le
>> problème et n'ayant pas besoin d'une camera (par l'utilisation de bouchon
>> utilisant un fichier image par exemple).
>> --
>> Paul Bacelar
>> MVP VC++
>>
>>
>> "Thomas" <daedric@daedric.com> wrote in message
>> news:79E4B120-5FD1-4DA7-889D-8A36477A1E57@microsoft.com...
>> > bonjour,
>> > je veux capturer a intervalle regulier une image a partir du flux de
>> > webcam
>> > renvoyé
>> > j'arrive a recuperer le flux de la camera sans probleme mais des que
>> > j'appel
>> > la mehode de capture j'ai une cast exception :
>> > voici la methode :
>> >
>> > public void captImg(){
>> >
>> > int hr;
>> > Trace.WriteLine("!!BTN: toolBarBtnGrab");
>> >
>> > if (savedArray == null)
>> > {
>> > int size = videoInfoHeader.BmiHeader.ImageSize;
>> > if ((size < 1000) || (size > 16000000))
>> > return;
>> > savedArray = new byte[size + 64000];
>> > }
>> >
>> > // toolBarBtnSave.Enabled = false;
>> > Image old = pictureBox1.Image;
>> > pictureBox1.Image = null;
>> > if (old != null)
>> > old.Dispose();
>> >
>> > // toolBarBtnGrab.Enabled = false;
>> > captured = false;
>> > //MessageBox.Show(""+this);
>> > hr = sampGrabber.SetCallback(this, 0); => ligne fautive
>> >
>> > }
>> >
>> > apres voici l'autre methode :
>> >
>> > int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int
>> > BufferLen)
>> > {
>> > if (savedArray == null)
>> > {
>> > return 0;
>> > }
>> >
>> > if ((pBuffer != IntPtr.Zero) && (BufferLen > 1000) &&
>> > (BufferLen <= savedArray.Length))
>> > Marshal.Copy(pBuffer, savedArray, 0, BufferLen);
>> >
>> > this.OnCaptureDone();
>> > return 0;
>> > }
>> >
>> >
>> > ce qui me derange c'est que quand j'appel la methode a partir d'un
>> > boutton
>> > ca marche impec mais des que je passe par un autre Thread pour appeler
>> > la
>> > methode ca ne marche pas (par reference instancedemaform.captImg())
>> >
>> > voila est ce que quelqu'un a eut le meme probleme ?
>> > si oui comment le resoudre ?
>> >
>> > merci
>> > bonne soiree
>> >
>>
>>
>>
Pour vérifier que le problème est bien un problème d'appartment COM,
pouvez-vous vérifier avec Thread.GetApartmentState()
(http://msdn2.microsoft.com/en-us/library/system.threading.thread.getapartmentstate.aspx)
que l'appel via le bouton et l'appel via un workingThread ne dispose pas des
mêmes environnement COM.
Si c'est bien le cas, le problème pourrais être résolu en utilisant un appel
à Thread.SetApartmentState() dans le workingThread.
Nous attendons votre feedback.
--
Paul Bacelar
MVP VC++
"Thomas" wrote in message
news:
> pour le morceau de code je ne crois pas etant donne que c'est la capture
> qui
> deconne particulierement et que je peut demarre la preview a partir d'une
> autre classe...
>
> sinon je vois pas tres bien ce que tu veux dire par classe proxy ... une
> dll
> ?
> si oui je suppose qu'il faut l'enregistrer par regsvr32
>
> enfin je vais faire un petit tour sur google voir ce que tu voulais dire
> ...
>
> merci encore une fois ;) il y a bien un des deux composant qui feras ce
> que
> je demande ...
> "Paul Bacelar" wrote:
>
>> "daedric" c'est ton pseudo?
>>
>> http://www.developpez.net/forums/archive/index.php/t-168034.html
>>
>> Si oui, t'étais bien plus précis il y a 1 mois ;-).
>>
>> A en croire la trace dans le premier poste du lien, Mose donne une
>> explication des plus convaincante.
>>
>> Pour expliquer la différence de comportement entre bouton et Thread, et
>> sans
>> avoir l'intégralité du code, je pencherais pour un problème de composant
>> COM
>> marqué comme STA (SigleThreadedAppartment) et que la classe proxy de ce
>> composant n'est pas enregistré sur la machine.
>>
>> Peux-tu mettre à notre disposition une version du projet reproduisant le
>> problème et n'ayant pas besoin d'une camera (par l'utilisation de bouchon
>> utilisant un fichier image par exemple).
>> --
>> Paul Bacelar
>> MVP VC++
>>
>>
>> "Thomas" wrote in message
>> news:
>> > bonjour,
>> > je veux capturer a intervalle regulier une image a partir du flux de
>> > webcam
>> > renvoyé
>> > j'arrive a recuperer le flux de la camera sans probleme mais des que
>> > j'appel
>> > la mehode de capture j'ai une cast exception :
>> > voici la methode :
>> >
>> > public void captImg(){
>> >
>> > int hr;
>> > Trace.WriteLine("!!BTN: toolBarBtnGrab");
>> >
>> > if (savedArray == null)
>> > {
>> > int size = videoInfoHeader.BmiHeader.ImageSize;
>> > if ((size < 1000) || (size > 16000000))
>> > return;
>> > savedArray = new byte[size + 64000];
>> > }
>> >
>> > // toolBarBtnSave.Enabled = false;
>> > Image old = pictureBox1.Image;
>> > pictureBox1.Image = null;
>> > if (old != null)
>> > old.Dispose();
>> >
>> > // toolBarBtnGrab.Enabled = false;
>> > captured = false;
>> > //MessageBox.Show(""+this);
>> > hr = sampGrabber.SetCallback(this, 0); => ligne fautive
>> >
>> > }
>> >
>> > apres voici l'autre methode :
>> >
>> > int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int
>> > BufferLen)
>> > {
>> > if (savedArray == null)
>> > {
>> > return 0;
>> > }
>> >
>> > if ((pBuffer != IntPtr.Zero) && (BufferLen > 1000) &&
>> > (BufferLen <= savedArray.Length))
>> > Marshal.Copy(pBuffer, savedArray, 0, BufferLen);
>> >
>> > this.OnCaptureDone();
>> > return 0;
>> > }
>> >
>> >
>> > ce qui me derange c'est que quand j'appel la methode a partir d'un
>> > boutton
>> > ca marche impec mais des que je passe par un autre Thread pour appeler
>> > la
>> > methode ca ne marche pas (par reference instancedemaform.captImg())
>> >
>> > voila est ce que quelqu'un a eut le meme probleme ?
>> > si oui comment le resoudre ?
>> >
>> > merci
>> > bonne soiree
>> >
>>
>>
>>
merci
donc toujours un petit probleme mais plus le meme:
explication:
dans le Thread qui prend les photos => bool b =
princ.photo.TrySetApartmentState(ApartmentState.MTA);
le changement a etait effectué ensuite
selon que j'appel la methode de capture directement par la reference de la
form ( a savoir princ)
j'ai la meme erreur
par contre si je fais :
public void invokecapt()
{
this.Invoke(new DelcaptImg(capt));
}
public delegate void DelcaptImg();
public void captImg(){
.......}
et que j'appel invokecapt
je n'ai plus l'erreur mais par contre la capture n'est pas effectué et je me
retrouve avec un nullpointeur sur cette methode :
public void saveIn(string file)
{
Image img = this.pictureBox1.Image;
Bitmap bmp = new Bitmap(img); // ici
bmp.Save(file, System.Drawing.Imaging.ImageFormat.Jpeg);
}
car aucune image n'a etait capture
merci pour vos reponses, surtout a trois heure du mat ...
je vais continuer a creuser pour voir , un mode pas a pas en particulier :p
+
et encore merci
"Paul Bacelar" wrote:
> Pour vérifier que le problème est bien un problème d'appartment COM,
> pouvez-vous vérifier avec Thread.GetApartmentState()
> (http://msdn2.microsoft.com/en-us/library/system.threading.thread.getapartmentstate.aspx)
> que l'appel via le bouton et l'appel via un workingThread ne dispose pas des
> mêmes environnement COM.
>
> Si c'est bien le cas, le problème pourrais être résolu en utilisant un appel
> à Thread.SetApartmentState() dans le workingThread.
>
> Nous attendons votre feedback.
> --
> Paul Bacelar
> MVP VC++
>
>
> "Thomas" wrote in message
> news:
> > pour le morceau de code je ne crois pas etant donne que c'est la capture
> > qui
> > deconne particulierement et que je peut demarre la preview a partir d'une
> > autre classe...
> >
> > sinon je vois pas tres bien ce que tu veux dire par classe proxy ... une
> > dll
> > ?
> > si oui je suppose qu'il faut l'enregistrer par regsvr32
> >
> > enfin je vais faire un petit tour sur google voir ce que tu voulais dire
> > ...
> >
> > merci encore une fois ;) il y a bien un des deux composant qui feras ce
> > que
> > je demande ...
> > "Paul Bacelar" wrote:
> >
> >> "daedric" c'est ton pseudo?
> >>
> >> http://www.developpez.net/forums/archive/index.php/t-168034.html
> >>
> >> Si oui, t'étais bien plus précis il y a 1 mois ;-).
> >>
> >> A en croire la trace dans le premier poste du lien, Mose donne une
> >> explication des plus convaincante.
> >>
> >> Pour expliquer la différence de comportement entre bouton et Thread, et
> >> sans
> >> avoir l'intégralité du code, je pencherais pour un problème de composant
> >> COM
> >> marqué comme STA (SigleThreadedAppartment) et que la classe proxy de ce
> >> composant n'est pas enregistré sur la machine.
> >>
> >> Peux-tu mettre à notre disposition une version du projet reproduisant le
> >> problème et n'ayant pas besoin d'une camera (par l'utilisation de bouchon
> >> utilisant un fichier image par exemple).
> >> --
> >> Paul Bacelar
> >> MVP VC++
> >>
> >>
> >> "Thomas" wrote in message
> >> news:
> >> > bonjour,
> >> > je veux capturer a intervalle regulier une image a partir du flux de
> >> > webcam
> >> > renvoyé
> >> > j'arrive a recuperer le flux de la camera sans probleme mais des que
> >> > j'appel
> >> > la mehode de capture j'ai une cast exception :
> >> > voici la methode :
> >> >
> >> > public void captImg(){
> >> >
> >> > int hr;
> >> > Trace.WriteLine("!!BTN: toolBarBtnGrab");
> >> >
> >> > if (savedArray == null)
> >> > {
> >> > int size = videoInfoHeader.BmiHeader.ImageSize;
> >> > if ((size < 1000) || (size > 16000000))
> >> > return;
> >> > savedArray = new byte[size + 64000];
> >> > }
> >> >
> >> > // toolBarBtnSave.Enabled = false;
> >> > Image old = pictureBox1.Image;
> >> > pictureBox1.Image = null;
> >> > if (old != null)
> >> > old.Dispose();
> >> >
> >> > // toolBarBtnGrab.Enabled = false;
> >> > captured = false;
> >> > //MessageBox.Show(""+this);
> >> > hr = sampGrabber.SetCallback(this, 0); => ligne fautive
> >> >
> >> > }
> >> >
> >> > apres voici l'autre methode :
> >> >
> >> > int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int
> >> > BufferLen)
> >> > {
> >> > if (savedArray == null)
> >> > {
> >> > return 0;
> >> > }
> >> >
> >> > if ((pBuffer != IntPtr.Zero) && (BufferLen > 1000) &&
> >> > (BufferLen <= savedArray.Length))
> >> > Marshal.Copy(pBuffer, savedArray, 0, BufferLen);
> >> >
> >> > this.OnCaptureDone();
> >> > return 0;
> >> > }
> >> >
> >> >
> >> > ce qui me derange c'est que quand j'appel la methode a partir d'un
> >> > boutton
> >> > ca marche impec mais des que je passe par un autre Thread pour appeler
> >> > la
> >> > methode ca ne marche pas (par reference instancedemaform.captImg())
> >> >
> >> > voila est ce que quelqu'un a eut le meme probleme ?
> >> > si oui comment le resoudre ?
> >> >
> >> > merci
> >> > bonne soiree
> >> >
> >>
> >>
> >>
>
>
>
merci
donc toujours un petit probleme mais plus le meme:
explication:
dans le Thread qui prend les photos => bool b =
princ.photo.TrySetApartmentState(ApartmentState.MTA);
le changement a etait effectué ensuite
selon que j'appel la methode de capture directement par la reference de la
form ( a savoir princ)
j'ai la meme erreur
par contre si je fais :
public void invokecapt()
{
this.Invoke(new DelcaptImg(capt));
}
public delegate void DelcaptImg();
public void captImg(){
.......}
et que j'appel invokecapt
je n'ai plus l'erreur mais par contre la capture n'est pas effectué et je me
retrouve avec un nullpointeur sur cette methode :
public void saveIn(string file)
{
Image img = this.pictureBox1.Image;
Bitmap bmp = new Bitmap(img); // ici
bmp.Save(file, System.Drawing.Imaging.ImageFormat.Jpeg);
}
car aucune image n'a etait capture
merci pour vos reponses, surtout a trois heure du mat ...
je vais continuer a creuser pour voir , un mode pas a pas en particulier :p
+
et encore merci
"Paul Bacelar" wrote:
> Pour vérifier que le problème est bien un problème d'appartment COM,
> pouvez-vous vérifier avec Thread.GetApartmentState()
> (http://msdn2.microsoft.com/en-us/library/system.threading.thread.getapartmentstate.aspx)
> que l'appel via le bouton et l'appel via un workingThread ne dispose pas des
> mêmes environnement COM.
>
> Si c'est bien le cas, le problème pourrais être résolu en utilisant un appel
> à Thread.SetApartmentState() dans le workingThread.
>
> Nous attendons votre feedback.
> --
> Paul Bacelar
> MVP VC++
>
>
> "Thomas" <daedric@daedric.com> wrote in message
> news:5B9B762E-70E4-4489-97BA-2706A711FFF1@microsoft.com...
> > pour le morceau de code je ne crois pas etant donne que c'est la capture
> > qui
> > deconne particulierement et que je peut demarre la preview a partir d'une
> > autre classe...
> >
> > sinon je vois pas tres bien ce que tu veux dire par classe proxy ... une
> > dll
> > ?
> > si oui je suppose qu'il faut l'enregistrer par regsvr32
> >
> > enfin je vais faire un petit tour sur google voir ce que tu voulais dire
> > ...
> >
> > merci encore une fois ;) il y a bien un des deux composant qui feras ce
> > que
> > je demande ...
> > "Paul Bacelar" wrote:
> >
> >> "daedric" c'est ton pseudo?
> >>
> >> http://www.developpez.net/forums/archive/index.php/t-168034.html
> >>
> >> Si oui, t'étais bien plus précis il y a 1 mois ;-).
> >>
> >> A en croire la trace dans le premier poste du lien, Mose donne une
> >> explication des plus convaincante.
> >>
> >> Pour expliquer la différence de comportement entre bouton et Thread, et
> >> sans
> >> avoir l'intégralité du code, je pencherais pour un problème de composant
> >> COM
> >> marqué comme STA (SigleThreadedAppartment) et que la classe proxy de ce
> >> composant n'est pas enregistré sur la machine.
> >>
> >> Peux-tu mettre à notre disposition une version du projet reproduisant le
> >> problème et n'ayant pas besoin d'une camera (par l'utilisation de bouchon
> >> utilisant un fichier image par exemple).
> >> --
> >> Paul Bacelar
> >> MVP VC++
> >>
> >>
> >> "Thomas" <daedric@daedric.com> wrote in message
> >> news:79E4B120-5FD1-4DA7-889D-8A36477A1E57@microsoft.com...
> >> > bonjour,
> >> > je veux capturer a intervalle regulier une image a partir du flux de
> >> > webcam
> >> > renvoyé
> >> > j'arrive a recuperer le flux de la camera sans probleme mais des que
> >> > j'appel
> >> > la mehode de capture j'ai une cast exception :
> >> > voici la methode :
> >> >
> >> > public void captImg(){
> >> >
> >> > int hr;
> >> > Trace.WriteLine("!!BTN: toolBarBtnGrab");
> >> >
> >> > if (savedArray == null)
> >> > {
> >> > int size = videoInfoHeader.BmiHeader.ImageSize;
> >> > if ((size < 1000) || (size > 16000000))
> >> > return;
> >> > savedArray = new byte[size + 64000];
> >> > }
> >> >
> >> > // toolBarBtnSave.Enabled = false;
> >> > Image old = pictureBox1.Image;
> >> > pictureBox1.Image = null;
> >> > if (old != null)
> >> > old.Dispose();
> >> >
> >> > // toolBarBtnGrab.Enabled = false;
> >> > captured = false;
> >> > //MessageBox.Show(""+this);
> >> > hr = sampGrabber.SetCallback(this, 0); => ligne fautive
> >> >
> >> > }
> >> >
> >> > apres voici l'autre methode :
> >> >
> >> > int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int
> >> > BufferLen)
> >> > {
> >> > if (savedArray == null)
> >> > {
> >> > return 0;
> >> > }
> >> >
> >> > if ((pBuffer != IntPtr.Zero) && (BufferLen > 1000) &&
> >> > (BufferLen <= savedArray.Length))
> >> > Marshal.Copy(pBuffer, savedArray, 0, BufferLen);
> >> >
> >> > this.OnCaptureDone();
> >> > return 0;
> >> > }
> >> >
> >> >
> >> > ce qui me derange c'est que quand j'appel la methode a partir d'un
> >> > boutton
> >> > ca marche impec mais des que je passe par un autre Thread pour appeler
> >> > la
> >> > methode ca ne marche pas (par reference instancedemaform.captImg())
> >> >
> >> > voila est ce que quelqu'un a eut le meme probleme ?
> >> > si oui comment le resoudre ?
> >> >
> >> > merci
> >> > bonne soiree
> >> >
> >>
> >>
> >>
>
>
>
merci
donc toujours un petit probleme mais plus le meme:
explication:
dans le Thread qui prend les photos => bool b =
princ.photo.TrySetApartmentState(ApartmentState.MTA);
le changement a etait effectué ensuite
selon que j'appel la methode de capture directement par la reference de la
form ( a savoir princ)
j'ai la meme erreur
par contre si je fais :
public void invokecapt()
{
this.Invoke(new DelcaptImg(capt));
}
public delegate void DelcaptImg();
public void captImg(){
.......}
et que j'appel invokecapt
je n'ai plus l'erreur mais par contre la capture n'est pas effectué et je me
retrouve avec un nullpointeur sur cette methode :
public void saveIn(string file)
{
Image img = this.pictureBox1.Image;
Bitmap bmp = new Bitmap(img); // ici
bmp.Save(file, System.Drawing.Imaging.ImageFormat.Jpeg);
}
car aucune image n'a etait capture
merci pour vos reponses, surtout a trois heure du mat ...
je vais continuer a creuser pour voir , un mode pas a pas en particulier :p
+
et encore merci
"Paul Bacelar" wrote:
> Pour vérifier que le problème est bien un problème d'appartment COM,
> pouvez-vous vérifier avec Thread.GetApartmentState()
> (http://msdn2.microsoft.com/en-us/library/system.threading.thread.getapartmentstate.aspx)
> que l'appel via le bouton et l'appel via un workingThread ne dispose pas des
> mêmes environnement COM.
>
> Si c'est bien le cas, le problème pourrais être résolu en utilisant un appel
> à Thread.SetApartmentState() dans le workingThread.
>
> Nous attendons votre feedback.
> --
> Paul Bacelar
> MVP VC++
>
>
> "Thomas" wrote in message
> news:
> > pour le morceau de code je ne crois pas etant donne que c'est la capture
> > qui
> > deconne particulierement et que je peut demarre la preview a partir d'une
> > autre classe...
> >
> > sinon je vois pas tres bien ce que tu veux dire par classe proxy ... une
> > dll
> > ?
> > si oui je suppose qu'il faut l'enregistrer par regsvr32
> >
> > enfin je vais faire un petit tour sur google voir ce que tu voulais dire
> > ...
> >
> > merci encore une fois ;) il y a bien un des deux composant qui feras ce
> > que
> > je demande ...
> > "Paul Bacelar" wrote:
> >
> >> "daedric" c'est ton pseudo?
> >>
> >> http://www.developpez.net/forums/archive/index.php/t-168034.html
> >>
> >> Si oui, t'étais bien plus précis il y a 1 mois ;-).
> >>
> >> A en croire la trace dans le premier poste du lien, Mose donne une
> >> explication des plus convaincante.
> >>
> >> Pour expliquer la différence de comportement entre bouton et Thread, et
> >> sans
> >> avoir l'intégralité du code, je pencherais pour un problème de composant
> >> COM
> >> marqué comme STA (SigleThreadedAppartment) et que la classe proxy de ce
> >> composant n'est pas enregistré sur la machine.
> >>
> >> Peux-tu mettre à notre disposition une version du projet reproduisant le
> >> problème et n'ayant pas besoin d'une camera (par l'utilisation de bouchon
> >> utilisant un fichier image par exemple).
> >> --
> >> Paul Bacelar
> >> MVP VC++
> >>
> >>
> >> "Thomas" wrote in message
> >> news:
> >> > bonjour,
> >> > je veux capturer a intervalle regulier une image a partir du flux de
> >> > webcam
> >> > renvoyé
> >> > j'arrive a recuperer le flux de la camera sans probleme mais des que
> >> > j'appel
> >> > la mehode de capture j'ai une cast exception :
> >> > voici la methode :
> >> >
> >> > public void captImg(){
> >> >
> >> > int hr;
> >> > Trace.WriteLine("!!BTN: toolBarBtnGrab");
> >> >
> >> > if (savedArray == null)
> >> > {
> >> > int size = videoInfoHeader.BmiHeader.ImageSize;
> >> > if ((size < 1000) || (size > 16000000))
> >> > return;
> >> > savedArray = new byte[size + 64000];
> >> > }
> >> >
> >> > // toolBarBtnSave.Enabled = false;
> >> > Image old = pictureBox1.Image;
> >> > pictureBox1.Image = null;
> >> > if (old != null)
> >> > old.Dispose();
> >> >
> >> > // toolBarBtnGrab.Enabled = false;
> >> > captured = false;
> >> > //MessageBox.Show(""+this);
> >> > hr = sampGrabber.SetCallback(this, 0); => ligne fautive
> >> >
> >> > }
> >> >
> >> > apres voici l'autre methode :
> >> >
> >> > int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int
> >> > BufferLen)
> >> > {
> >> > if (savedArray == null)
> >> > {
> >> > return 0;
> >> > }
> >> >
> >> > if ((pBuffer != IntPtr.Zero) && (BufferLen > 1000) &&
> >> > (BufferLen <= savedArray.Length))
> >> > Marshal.Copy(pBuffer, savedArray, 0, BufferLen);
> >> >
> >> > this.OnCaptureDone();
> >> > return 0;
> >> > }
> >> >
> >> >
> >> > ce qui me derange c'est que quand j'appel la methode a partir d'un
> >> > boutton
> >> > ca marche impec mais des que je passe par un autre Thread pour appeler
> >> > la
> >> > methode ca ne marche pas (par reference instancedemaform.captImg())
> >> >
> >> > voila est ce que quelqu'un a eut le meme probleme ?
> >> > si oui comment le resoudre ?
> >> >
> >> > merci
> >> > bonne soiree
> >> >
> >>
> >>
> >>
>
>
>
re,
d'abord correction :
public void invokecapt()
{
this.Invoke(new DelcaptImg(captImg));
}
public delegate void DelcaptImg();
public void captImg(){
.......
hr = sampGrabber.SetCallback(this, 0);
}
ensuite quand je fais ca la ligne :
hr = sampGrabber.SetCallback(this, 0);
n'est pas prise en compte => je ne rentre jamais dans SetCallBack
donc rien n'est capturé ...
avez vous un idee ?
"Thomas" wrote:merci
donc toujours un petit probleme mais plus le meme:
explication:
dans le Thread qui prend les photos => bool b >> princ.photo.TrySetApartmentState(ApartmentState.MTA);
le changement a etait effectué ensuite
selon que j'appel la methode de capture directement par la reference de
la
form ( a savoir princ)
j'ai la meme erreur
par contre si je fais :
public void invokecapt()
{
this.Invoke(new DelcaptImg(capt));
}
public delegate void DelcaptImg();
public void captImg(){
.......}
et que j'appel invokecapt
je n'ai plus l'erreur mais par contre la capture n'est pas effectué et je
me
retrouve avec un nullpointeur sur cette methode :
public void saveIn(string file)
{
Image img = this.pictureBox1.Image;
Bitmap bmp = new Bitmap(img); // ici
bmp.Save(file, System.Drawing.Imaging.ImageFormat.Jpeg);
}
car aucune image n'a etait capture
merci pour vos reponses, surtout a trois heure du mat ...
je vais continuer a creuser pour voir , un mode pas a pas en particulier
:p
+
et encore merci
"Paul Bacelar" wrote:
> Pour vérifier que le problème est bien un problème d'appartment COM,
> pouvez-vous vérifier avec Thread.GetApartmentState()
> (http://msdn2.microsoft.com/en-us/library/system.threading.thread.getapartmentstate.aspx)
> que l'appel via le bouton et l'appel via un workingThread ne dispose
> pas des
> mêmes environnement COM.
>
> Si c'est bien le cas, le problème pourrais être résolu en utilisant un
> appel
> à Thread.SetApartmentState() dans le workingThread.
>
> Nous attendons votre feedback.
> --
> Paul Bacelar
> MVP VC++
>
>
> "Thomas" wrote in message
> news:
> > pour le morceau de code je ne crois pas etant donne que c'est la
> > capture
> > qui
> > deconne particulierement et que je peut demarre la preview a partir
> > d'une
> > autre classe...
> >
> > sinon je vois pas tres bien ce que tu veux dire par classe proxy ...
> > une
> > dll
> > ?
> > si oui je suppose qu'il faut l'enregistrer par regsvr32
> >
> > enfin je vais faire un petit tour sur google voir ce que tu voulais
> > dire
> > ...
> >
> > merci encore une fois ;) il y a bien un des deux composant qui feras
> > ce
> > que
> > je demande ...
> > "Paul Bacelar" wrote:
> >
> >> "daedric" c'est ton pseudo?
> >>
> >> http://www.developpez.net/forums/archive/index.php/t-168034.html
> >>
> >> Si oui, t'étais bien plus précis il y a 1 mois ;-).
> >>
> >> A en croire la trace dans le premier poste du lien, Mose donne une
> >> explication des plus convaincante.
> >>
> >> Pour expliquer la différence de comportement entre bouton et Thread,
> >> et
> >> sans
> >> avoir l'intégralité du code, je pencherais pour un problème de
> >> composant
> >> COM
> >> marqué comme STA (SigleThreadedAppartment) et que la classe proxy de
> >> ce
> >> composant n'est pas enregistré sur la machine.
> >>
> >> Peux-tu mettre à notre disposition une version du projet
> >> reproduisant le
> >> problème et n'ayant pas besoin d'une camera (par l'utilisation de
> >> bouchon
> >> utilisant un fichier image par exemple).
> >> --
> >> Paul Bacelar
> >> MVP VC++
> >>
> >>
> >> "Thomas" wrote in message
> >> news:
> >> > bonjour,
> >> > je veux capturer a intervalle regulier une image a partir du flux
> >> > de
> >> > webcam
> >> > renvoyé
> >> > j'arrive a recuperer le flux de la camera sans probleme mais des
> >> > que
> >> > j'appel
> >> > la mehode de capture j'ai une cast exception :
> >> > voici la methode :
> >> >
> >> > public void captImg(){
> >> >
> >> > int hr;
> >> > Trace.WriteLine("!!BTN: toolBarBtnGrab");
> >> >
> >> > if (savedArray == null)
> >> > {
> >> > int size = videoInfoHeader.BmiHeader.ImageSize;
> >> > if ((size < 1000) || (size > 16000000))
> >> > return;
> >> > savedArray = new byte[size + 64000];
> >> > }
> >> >
> >> > // toolBarBtnSave.Enabled = false;
> >> > Image old = pictureBox1.Image;
> >> > pictureBox1.Image = null;
> >> > if (old != null)
> >> > old.Dispose();
> >> >
> >> > // toolBarBtnGrab.Enabled = false;
> >> > captured = false;
> >> > //MessageBox.Show(""+this);
> >> > hr = sampGrabber.SetCallback(this, 0); => ligne fautive
> >> >
> >> > }
> >> >
> >> > apres voici l'autre methode :
> >> >
> >> > int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer,
> >> > int
> >> > BufferLen)
> >> > {
> >> > if (savedArray == null)
> >> > {
> >> > return 0;
> >> > }
> >> >
> >> > if ((pBuffer != IntPtr.Zero) && (BufferLen > 1000) &&
> >> > (BufferLen <= savedArray.Length))
> >> > Marshal.Copy(pBuffer, savedArray, 0, BufferLen);
> >> >
> >> > this.OnCaptureDone();
> >> > return 0;
> >> > }
> >> >
> >> >
> >> > ce qui me derange c'est que quand j'appel la methode a partir d'un
> >> > boutton
> >> > ca marche impec mais des que je passe par un autre Thread pour
> >> > appeler
> >> > la
> >> > methode ca ne marche pas (par reference
> >> > instancedemaform.captImg())
> >> >
> >> > voila est ce que quelqu'un a eut le meme probleme ?
> >> > si oui comment le resoudre ?
> >> >
> >> > merci
> >> > bonne soiree
> >> >
> >>
> >>
> >>
>
>
>
re,
d'abord correction :
public void invokecapt()
{
this.Invoke(new DelcaptImg(captImg));
}
public delegate void DelcaptImg();
public void captImg(){
.......
hr = sampGrabber.SetCallback(this, 0);
}
ensuite quand je fais ca la ligne :
hr = sampGrabber.SetCallback(this, 0);
n'est pas prise en compte => je ne rentre jamais dans SetCallBack
donc rien n'est capturé ...
avez vous un idee ?
"Thomas" wrote:
merci
donc toujours un petit probleme mais plus le meme:
explication:
dans le Thread qui prend les photos => bool b >> princ.photo.TrySetApartmentState(ApartmentState.MTA);
le changement a etait effectué ensuite
selon que j'appel la methode de capture directement par la reference de
la
form ( a savoir princ)
j'ai la meme erreur
par contre si je fais :
public void invokecapt()
{
this.Invoke(new DelcaptImg(capt));
}
public delegate void DelcaptImg();
public void captImg(){
.......}
et que j'appel invokecapt
je n'ai plus l'erreur mais par contre la capture n'est pas effectué et je
me
retrouve avec un nullpointeur sur cette methode :
public void saveIn(string file)
{
Image img = this.pictureBox1.Image;
Bitmap bmp = new Bitmap(img); // ici
bmp.Save(file, System.Drawing.Imaging.ImageFormat.Jpeg);
}
car aucune image n'a etait capture
merci pour vos reponses, surtout a trois heure du mat ...
je vais continuer a creuser pour voir , un mode pas a pas en particulier
:p
+
et encore merci
"Paul Bacelar" wrote:
> Pour vérifier que le problème est bien un problème d'appartment COM,
> pouvez-vous vérifier avec Thread.GetApartmentState()
> (http://msdn2.microsoft.com/en-us/library/system.threading.thread.getapartmentstate.aspx)
> que l'appel via le bouton et l'appel via un workingThread ne dispose
> pas des
> mêmes environnement COM.
>
> Si c'est bien le cas, le problème pourrais être résolu en utilisant un
> appel
> à Thread.SetApartmentState() dans le workingThread.
>
> Nous attendons votre feedback.
> --
> Paul Bacelar
> MVP VC++
>
>
> "Thomas" <daedric@daedric.com> wrote in message
> news:5B9B762E-70E4-4489-97BA-2706A711FFF1@microsoft.com...
> > pour le morceau de code je ne crois pas etant donne que c'est la
> > capture
> > qui
> > deconne particulierement et que je peut demarre la preview a partir
> > d'une
> > autre classe...
> >
> > sinon je vois pas tres bien ce que tu veux dire par classe proxy ...
> > une
> > dll
> > ?
> > si oui je suppose qu'il faut l'enregistrer par regsvr32
> >
> > enfin je vais faire un petit tour sur google voir ce que tu voulais
> > dire
> > ...
> >
> > merci encore une fois ;) il y a bien un des deux composant qui feras
> > ce
> > que
> > je demande ...
> > "Paul Bacelar" wrote:
> >
> >> "daedric" c'est ton pseudo?
> >>
> >> http://www.developpez.net/forums/archive/index.php/t-168034.html
> >>
> >> Si oui, t'étais bien plus précis il y a 1 mois ;-).
> >>
> >> A en croire la trace dans le premier poste du lien, Mose donne une
> >> explication des plus convaincante.
> >>
> >> Pour expliquer la différence de comportement entre bouton et Thread,
> >> et
> >> sans
> >> avoir l'intégralité du code, je pencherais pour un problème de
> >> composant
> >> COM
> >> marqué comme STA (SigleThreadedAppartment) et que la classe proxy de
> >> ce
> >> composant n'est pas enregistré sur la machine.
> >>
> >> Peux-tu mettre à notre disposition une version du projet
> >> reproduisant le
> >> problème et n'ayant pas besoin d'une camera (par l'utilisation de
> >> bouchon
> >> utilisant un fichier image par exemple).
> >> --
> >> Paul Bacelar
> >> MVP VC++
> >>
> >>
> >> "Thomas" <daedric@daedric.com> wrote in message
> >> news:79E4B120-5FD1-4DA7-889D-8A36477A1E57@microsoft.com...
> >> > bonjour,
> >> > je veux capturer a intervalle regulier une image a partir du flux
> >> > de
> >> > webcam
> >> > renvoyé
> >> > j'arrive a recuperer le flux de la camera sans probleme mais des
> >> > que
> >> > j'appel
> >> > la mehode de capture j'ai une cast exception :
> >> > voici la methode :
> >> >
> >> > public void captImg(){
> >> >
> >> > int hr;
> >> > Trace.WriteLine("!!BTN: toolBarBtnGrab");
> >> >
> >> > if (savedArray == null)
> >> > {
> >> > int size = videoInfoHeader.BmiHeader.ImageSize;
> >> > if ((size < 1000) || (size > 16000000))
> >> > return;
> >> > savedArray = new byte[size + 64000];
> >> > }
> >> >
> >> > // toolBarBtnSave.Enabled = false;
> >> > Image old = pictureBox1.Image;
> >> > pictureBox1.Image = null;
> >> > if (old != null)
> >> > old.Dispose();
> >> >
> >> > // toolBarBtnGrab.Enabled = false;
> >> > captured = false;
> >> > //MessageBox.Show(""+this);
> >> > hr = sampGrabber.SetCallback(this, 0); => ligne fautive
> >> >
> >> > }
> >> >
> >> > apres voici l'autre methode :
> >> >
> >> > int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer,
> >> > int
> >> > BufferLen)
> >> > {
> >> > if (savedArray == null)
> >> > {
> >> > return 0;
> >> > }
> >> >
> >> > if ((pBuffer != IntPtr.Zero) && (BufferLen > 1000) &&
> >> > (BufferLen <= savedArray.Length))
> >> > Marshal.Copy(pBuffer, savedArray, 0, BufferLen);
> >> >
> >> > this.OnCaptureDone();
> >> > return 0;
> >> > }
> >> >
> >> >
> >> > ce qui me derange c'est que quand j'appel la methode a partir d'un
> >> > boutton
> >> > ca marche impec mais des que je passe par un autre Thread pour
> >> > appeler
> >> > la
> >> > methode ca ne marche pas (par reference
> >> > instancedemaform.captImg())
> >> >
> >> > voila est ce que quelqu'un a eut le meme probleme ?
> >> > si oui comment le resoudre ?
> >> >
> >> > merci
> >> > bonne soiree
> >> >
> >>
> >>
> >>
>
>
>
re,
d'abord correction :
public void invokecapt()
{
this.Invoke(new DelcaptImg(captImg));
}
public delegate void DelcaptImg();
public void captImg(){
.......
hr = sampGrabber.SetCallback(this, 0);
}
ensuite quand je fais ca la ligne :
hr = sampGrabber.SetCallback(this, 0);
n'est pas prise en compte => je ne rentre jamais dans SetCallBack
donc rien n'est capturé ...
avez vous un idee ?
"Thomas" wrote:merci
donc toujours un petit probleme mais plus le meme:
explication:
dans le Thread qui prend les photos => bool b >> princ.photo.TrySetApartmentState(ApartmentState.MTA);
le changement a etait effectué ensuite
selon que j'appel la methode de capture directement par la reference de
la
form ( a savoir princ)
j'ai la meme erreur
par contre si je fais :
public void invokecapt()
{
this.Invoke(new DelcaptImg(capt));
}
public delegate void DelcaptImg();
public void captImg(){
.......}
et que j'appel invokecapt
je n'ai plus l'erreur mais par contre la capture n'est pas effectué et je
me
retrouve avec un nullpointeur sur cette methode :
public void saveIn(string file)
{
Image img = this.pictureBox1.Image;
Bitmap bmp = new Bitmap(img); // ici
bmp.Save(file, System.Drawing.Imaging.ImageFormat.Jpeg);
}
car aucune image n'a etait capture
merci pour vos reponses, surtout a trois heure du mat ...
je vais continuer a creuser pour voir , un mode pas a pas en particulier
:p
+
et encore merci
"Paul Bacelar" wrote:
> Pour vérifier que le problème est bien un problème d'appartment COM,
> pouvez-vous vérifier avec Thread.GetApartmentState()
> (http://msdn2.microsoft.com/en-us/library/system.threading.thread.getapartmentstate.aspx)
> que l'appel via le bouton et l'appel via un workingThread ne dispose
> pas des
> mêmes environnement COM.
>
> Si c'est bien le cas, le problème pourrais être résolu en utilisant un
> appel
> à Thread.SetApartmentState() dans le workingThread.
>
> Nous attendons votre feedback.
> --
> Paul Bacelar
> MVP VC++
>
>
> "Thomas" wrote in message
> news:
> > pour le morceau de code je ne crois pas etant donne que c'est la
> > capture
> > qui
> > deconne particulierement et que je peut demarre la preview a partir
> > d'une
> > autre classe...
> >
> > sinon je vois pas tres bien ce que tu veux dire par classe proxy ...
> > une
> > dll
> > ?
> > si oui je suppose qu'il faut l'enregistrer par regsvr32
> >
> > enfin je vais faire un petit tour sur google voir ce que tu voulais
> > dire
> > ...
> >
> > merci encore une fois ;) il y a bien un des deux composant qui feras
> > ce
> > que
> > je demande ...
> > "Paul Bacelar" wrote:
> >
> >> "daedric" c'est ton pseudo?
> >>
> >> http://www.developpez.net/forums/archive/index.php/t-168034.html
> >>
> >> Si oui, t'étais bien plus précis il y a 1 mois ;-).
> >>
> >> A en croire la trace dans le premier poste du lien, Mose donne une
> >> explication des plus convaincante.
> >>
> >> Pour expliquer la différence de comportement entre bouton et Thread,
> >> et
> >> sans
> >> avoir l'intégralité du code, je pencherais pour un problème de
> >> composant
> >> COM
> >> marqué comme STA (SigleThreadedAppartment) et que la classe proxy de
> >> ce
> >> composant n'est pas enregistré sur la machine.
> >>
> >> Peux-tu mettre à notre disposition une version du projet
> >> reproduisant le
> >> problème et n'ayant pas besoin d'une camera (par l'utilisation de
> >> bouchon
> >> utilisant un fichier image par exemple).
> >> --
> >> Paul Bacelar
> >> MVP VC++
> >>
> >>
> >> "Thomas" wrote in message
> >> news:
> >> > bonjour,
> >> > je veux capturer a intervalle regulier une image a partir du flux
> >> > de
> >> > webcam
> >> > renvoyé
> >> > j'arrive a recuperer le flux de la camera sans probleme mais des
> >> > que
> >> > j'appel
> >> > la mehode de capture j'ai une cast exception :
> >> > voici la methode :
> >> >
> >> > public void captImg(){
> >> >
> >> > int hr;
> >> > Trace.WriteLine("!!BTN: toolBarBtnGrab");
> >> >
> >> > if (savedArray == null)
> >> > {
> >> > int size = videoInfoHeader.BmiHeader.ImageSize;
> >> > if ((size < 1000) || (size > 16000000))
> >> > return;
> >> > savedArray = new byte[size + 64000];
> >> > }
> >> >
> >> > // toolBarBtnSave.Enabled = false;
> >> > Image old = pictureBox1.Image;
> >> > pictureBox1.Image = null;
> >> > if (old != null)
> >> > old.Dispose();
> >> >
> >> > // toolBarBtnGrab.Enabled = false;
> >> > captured = false;
> >> > //MessageBox.Show(""+this);
> >> > hr = sampGrabber.SetCallback(this, 0); => ligne fautive
> >> >
> >> > }
> >> >
> >> > apres voici l'autre methode :
> >> >
> >> > int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer,
> >> > int
> >> > BufferLen)
> >> > {
> >> > if (savedArray == null)
> >> > {
> >> > return 0;
> >> > }
> >> >
> >> > if ((pBuffer != IntPtr.Zero) && (BufferLen > 1000) &&
> >> > (BufferLen <= savedArray.Length))
> >> > Marshal.Copy(pBuffer, savedArray, 0, BufferLen);
> >> >
> >> > this.OnCaptureDone();
> >> > return 0;
> >> > }
> >> >
> >> >
> >> > ce qui me derange c'est que quand j'appel la methode a partir d'un
> >> > boutton
> >> > ca marche impec mais des que je passe par un autre Thread pour
> >> > appeler
> >> > la
> >> > methode ca ne marche pas (par reference
> >> > instancedemaform.captImg())
> >> >
> >> > voila est ce que quelqu'un a eut le meme probleme ?
> >> > si oui comment le resoudre ?
> >> >
> >> > merci
> >> > bonne soiree
> >> >
> >>
> >>
> >>
>
>
>