Mi problema de Hilos, casi resuelto

02/07/2004 - 10:54 por sandra_soria81 | Informe spam
Hola a todos!!!! Casi tengo solucionado mi problema de hilos, gracias a
mucha gente que me ha ayudado, y guiado; El problema era modificar una
caja de texto desde otro hilo, distinto al original, que es donde se creo;
Para ello:

HWND HandleEvolucionDescarga m_pPrincipal>m_CtrlEvolucionDescarga.GetSafeHwnd();
Handle de la ventana que quiero modficar; Se la paso al hilo:
AfxBeginThread(HiloDescarga, (LPVOID)HandleEvolucionDescarga);

En el hilo creo un objeto:
CEdit* EvolucionDescarga = (CEdit*) CWnd::FromHandle
((HWND)pEvolucionDescarga);

Y a partir de este, modifico el contenido:

EvolucionDescarga->GetWindowText(tmp);
tmp += _T("");
tmp += _T("Guardando en el fichero:");
EvolucionDescarga->SetWindowText(tmp);

Me sale perfectamente, pero ahora bien, realmente lo que quiero es modicar
varias cajas de texto, encuadradas en un control por pestañas, mi idea era
pasar por los parametros del hilo, tantos handles como ventanas, pero me
da un error, no se si es ke no se puede, o no se...:

HWND HandleEvolucionDescarga m_pPrincipal->m_CtrlEvolucionDescarga.GetSafeHwnd();

HWND HandleDescargados = m_pPrincipal->m_CtrlDescargados.GetSafeHwnd();

AfxBeginThread(HiloDescarga, (LPVOID)HandleEvolucionDescarga,
(LPVOID)HandleDescargados);

Me da un error en la llamada al hilo, en AfxBegin..., para ello tengo
declarado el hilo:

HiloDescarga(LPVOID,LPVOID);

Me da el siguiente error:
none of the 2 overloads can convert parameter 1 from type 'unsigned int
(__cdecl *)(void *,void *)'

Gracias por leerme, y gracias por ayudarme;

Preguntas similare

Leer las respuestas

#1 Sergio
02/07/2004 - 11:25 | Informe spam
Sandra wrote:
Hola a todos!!!! Casi tengo solucionado mi problema de hilos, gracias a
mucha gente que me ha ayudado, y guiado; El problema era modificar una
caja de texto desde otro hilo, distinto al original, que es donde se creo;
Para ello:

HWND HandleEvolucionDescarga > m_pPrincipal>m_CtrlEvolucionDescarga.GetSafeHwnd();
Handle de la ventana que quiero modficar; Se la paso al hilo:
AfxBeginThread(HiloDescarga, (LPVOID)HandleEvolucionDescarga);

En el hilo creo un objeto:
CEdit* EvolucionDescarga = (CEdit*) CWnd::FromHandle
((HWND)pEvolucionDescarga);

Y a partir de este, modifico el contenido:

EvolucionDescarga->GetWindowText(tmp);
tmp += _T("");
tmp += _T("Guardando en el fichero:");
EvolucionDescarga->SetWindowText(tmp);

Me sale perfectamente, pero ahora bien, realmente lo que quiero es modicar
varias cajas de texto, encuadradas en un control por pestañas, mi idea era
pasar por los parametros del hilo, tantos handles como ventanas, pero me
da un error, no se si es ke no se puede, o no se...:

HWND HandleEvolucionDescarga > m_pPrincipal->m_CtrlEvolucionDescarga.GetSafeHwnd();

HWND HandleDescargados = m_pPrincipal->m_CtrlDescargados.GetSafeHwnd();

AfxBeginThread(HiloDescarga, (LPVOID)HandleEvolucionDescarga,
(LPVOID)HandleDescargados);

Me da un error en la llamada al hilo, en AfxBegin..., para ello tengo
declarado el hilo:

HiloDescarga(LPVOID,LPVOID);

Me da el siguiente error:
none of the 2 overloads can convert parameter 1 from type 'unsigned int
(__cdecl *)(void *,void *)'

Gracias por leerme, y gracias por ayudarme;




En la documentacion de AfxBeginThread dice que el hilo debe ser
declarado de esta manera: UINT Hilo( LPVOID pParam );
Por lo que no puedes hacer la llamada tal y como la planteas, pero igual
si que puedes hacerte una estructura de handles, y pasar la estructura,
me explico
typedef struct tagHANDLES {
HANDLE HandleEvolucionDescarga;
HWND HandleDescargados;
} varioshandles;

y luego te declaras la variable como
varioshandles handles;
haces las llamadas pertinentes:
handles.HandleEvolucionDescarga = m_p..
handles.HandleDescargados = m_p..

y por úlitmo la llamada al hilo:
AfxBeginThread(HILODESCARGA,(LPVOID)handles);

Es lo que se me ocurre, prueba a ver si te funciona, y comenta.
Respuesta Responder a este mensaje
#2 sandra_soria81
02/07/2004 - 11:48 | Informe spam
Gracias; Pues no se me habia ocurrido, la verdad; Me produce un el
siguiente error:
error C2440: 'type cast': cannot convert from 'struct tagHANDLES' to 'void
*'
No user-defined-conversion operator available that can perform
this conversion, or the operator cannot be called

De todas formas gracias, y lo seguire intentando, si he llegado hasta
aqui, esto tb saldra; Si se te ocurre algo, dimelo;
Respuesta Responder a este mensaje
#3 Sergio
02/07/2004 - 11:59 | Informe spam
Sandra wrote:

Gracias; Pues no se me habia ocurrido, la verdad; Me produce un el
siguiente error:
error C2440: 'type cast': cannot convert from 'struct tagHANDLES' to 'void
*'
No user-defined-conversion operator available that can perform
this conversion, or the operator cannot be called

De todas formas gracias, y lo seguire intentando, si he llegado hasta
aqui, esto tb saldra; Si se te ocurre algo, dimelo;





Mea culpa, en la llamada al hilo debes poner un & delante de la variable
del tipo varioshandles, para pasar la dirección de memoria, no me
acordaba que debia ser un puntero.

Y en el hilo:
UINT hilo(LPVOID lParam) {
varioshandles *pHandles = (varioshandles *)lParam;
pHandles->.
}
Respuesta Responder a este mensaje
#4 sandra_soria81
02/07/2004 - 12:27 | Informe spam
Si, ahora no produce fallo de compilacion en la llamada:
UINT HiloDescarga(LPVOID lParam)
{
varioshandles *pHandles = (varioshandles *)lParam;

CEdit* Descargados = (CEdit*) CWnd::FromHandle
((HWND)pHandles->HandleDescargados);
CString tmp;
Descargados->GetWindowText(tmp);
tmp += _T("Archivo: ");
tmp += _T("");
Descargados->SetWindowText(tmp);

Ahora el fallo es en tiempo de ejecucion:

void CWnd::SetWindowText(LPCTSTR lpszString)
{
-> ASSERT(::IsWindow(m_hWnd));

if (m_pCtrlSite == NULL)
::SetWindowText(m_hWnd, lpszString);
else
m_pCtrlSite->SetWindowText(lpszString);
}

Seguire intentandolo, y si se os ocurre algo, lo probare; Gracias;

Sergio wrote:

Sandra wrote:

> Gracias; Pues no se me habia ocurrido, la verdad; Me produce un el
> siguiente error:
> error C2440: 'type cast': cannot convert from 'struct tagHANDLES' to 'void
> *'
> No user-defined-conversion operator available that can perform
> this conversion, or the operator cannot be called
>
> De todas formas gracias, y lo seguire intentando, si he llegado hasta
> aqui, esto tb saldra; Si se te ocurre algo, dimelo;
>


Mea culpa, en la llamada al hilo debes poner un & delante de la variable
del tipo varioshandles, para pasar la dirección de memoria, no me
acordaba que debia ser un puntero.

Y en el hilo:
UINT hilo(LPVOID lParam) {
varioshandles *pHandles = (varioshandles *)lParam;
pHandles->.
}
Respuesta Responder a este mensaje
#5 sandra_soria81
02/07/2004 - 13:00 | Informe spam
Jejejejee, no se lo que pasa, dice que no el articulo no existe y no puedo
descargarlo; Si quieres, me lo puedes mandar al correo, y le echo un ojo:
; Y ojala funcione!!!!

Sergio wrote:

Sandra wrote:
> Si, ahora no produce fallo de compilacion en la llamada:
> UINT HiloDescarga(LPVOID lParam)
> {
> varioshandles *pHandles = (varioshandles *)lParam;
>
> CEdit* Descargados = (CEdit*) CWnd::FromHandle
> ((HWND)pHandles->HandleDescargados);
> CString tmp;
> Descargados->GetWindowText(tmp);
> tmp += _T("Archivo: ");
> tmp += _T("rn");
> Descargados->SetWindowText(tmp);
>
> Ahora el fallo es en tiempo de ejecucion:
>
> void CWnd::SetWindowText(LPCTSTR lpszString)
> {
> -> ASSERT(::IsWindow(m_hWnd));
>
> if (m_pCtrlSite == NULL)
> ::SetWindowText(m_hWnd, lpszString);
> else
> m_pCtrlSite->SetWindowText(lpszString);
> }
>
> Seguire intentandolo, y si se os ocurre algo, lo probare; Gracias;

Toy perplejo, a mi si me funciona, te mando la prueba que yo he hecho.
Es un dialogo con dos CEdit. Escribe en el de la izquierda lo que
quieras, y cuando le des al boton que pone button1 (o así) te añadira a
lo que tengas " y olé".
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida