Home   Artículos   Recursos   Foros   
Artíclos recientes publicados en Latindevelopers:

Visual C++: NSDoubleEdit: Un control para el manejo de números decimales en Visual C++.
Visual C++: Implementando una Calculadora en Visual C++
Visual C++: CCommandLine: Una clase para el uso de la linea de comando
Visual C++: Una clase para el manejo del Registro


Hilos y objetos

Aqui programadores en la plataforma Win32 con Visual C++ de Microsoft...

Moderador: latindeveloper

Hilos y objetos

Notapor kikers25 el Mié Nov 16, 2005 5:50 am

Hola, que tal.
Tengo dos hilos a los que les paso un handle de ventana para crear luego dentro un listbox.Mi problema es si habria problemas al usar los dos la funcion AddString para añadir nuevas lineas al listBox, y si hay problemas cual seria la forma de sincronizarlos para que no den errores
kikers25
Novato
Novato
 
Mensajes: 5
Registrado: Mié Nov 16, 2005 5:39 am

Re: Hilos y objetos

Notapor latindeveloper el Mié Nov 16, 2005 8:17 am

Si puedes agregar/modificar elementos mediante varios hilos sobre el mismo listbox, los unocos problemas que puedo suponer son: Eliminar elementos inexistentes. Agregar elementos duplicados, etc.
Imagen
Avatar de Usuario
latindeveloper
Administrador
Administrador
 
Mensajes: 1061
Registrado: Lun Jun 02, 2003 8:29 pm
Ubicación: Peru

Hilos

Notapor kikers25 el Mié Nov 16, 2005 10:17 am

Acabo de crear una aplicacion MFC ke tiene un listbox y un boton, donde al hacer click en el boton creo dos hilos al que les paso el HWND del listbox y hacen lo mismo, uno escribe hilo1 y el otro hilo2 en el listbox.
Pues con los dos hilos ejecutandose me da un error en ejecucion y si pongo solo uno de ellos no.

Creo que otra posible opcion es enviar mensajes a la aplicacion para que esta escriba en el listbox pero no se como hacer que la clase procese los mensajes.

Por cierto, gracias por contestar :)
kikers25
Novato
Novato
 
Mensajes: 5
Registrado: Mié Nov 16, 2005 5:39 am

Hilos

Notapor kikers25 el Mié Nov 16, 2005 10:18 am

Acabo de crear una aplicacion MFC ke tiene un listbox y un boton, donde al hacer click en el boton creo dos hilos al que les paso el HWND del listbox y hacen lo mismo, uno escribe hilo1 y el otro hilo2 en el listbox.
Pues con los dos hilos ejecutandose me da un error en ejecucion y si pongo solo uno de ellos no.

Creo que otra posible opcion es enviar mensajes a la aplicacion para que esta escriba en el listbox pero no se como hacer que la clase procese los mensajes.

Por cierto, gracias por contestar :)
kikers25
Novato
Novato
 
Mensajes: 5
Registrado: Mié Nov 16, 2005 5:39 am

Re: Hilos

Notapor latindeveloper el Jue Nov 17, 2005 8:01 am

Cual es el error que salta cuando ejecutas?

en que segmento del codigo pasa?

con que codigo invocas la llamada al hilo?
Imagen
Avatar de Usuario
latindeveloper
Administrador
Administrador
 
Mensajes: 1061
Registrado: Lun Jun 02, 2003 8:29 pm
Ubicación: Peru

Notapor kikers25 el Jue Nov 17, 2005 11:17 am

El error que me da al ejecutar el código es "debug assertion failed" y me da las opciones de Anular, reintentar y Omitir.
Luego si le doy a reintentar me sale otra ventana por fallo de excepcion.
Al intentar depurar el error la linea donde se para es:
Código: Seleccionar todo
{ ASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, LB_ADDSTRING, 0, (LPARAM)lpszItem); }


El codigo con que invoco a los dos hilos es:
Código: Seleccionar todo
   argumento1=m_list1.GetSafeHwnd();
   argumento2=m_list1.GetSafeHwnd();
   AfxBeginThread(hilo1,&argumento1,THREAD_PRIORITY_HIGHEST,0,0,NULL);
   AfxBeginThread(hilo2,&argumento2,THREAD_PRIORITY_HIGHEST,0,0,NULL);

m_list1 es una variable miembro a el listbox

El cógio del hilo1(es igual al hilo dos solo que el dos escribe "Hilo 2" en el listbox) es el Siguiente:
Código: Seleccionar todo
UINT hilo1( LPVOID pParam )
{
   HWND *aux,nuevo;
   CListBox *lista;
   aux=(HWND*)pParam;
   nuevo=*aux;
   lista= (CListBox*) CWnd::FromHandle(nuevo);
   while(TRUE)
   {
      lista= (CListBox*) CWnd::FromHandle(nuevo);
      lista->AddString("Hilo 1");
      lista->SetScrollPos(SB_VERT,10000,TRUE);
      Sleep(400);
   }
}
kikers25
Novato
Novato
 
Mensajes: 5
Registrado: Mié Nov 16, 2005 5:39 am

Notapor latindeveloper el Jue Nov 17, 2005 12:14 pm

Intenta con esto:
Código: Seleccionar todo
   AfxBeginThread(hilo1,&m_list1,THREAD_PRIORITY_HIGHEST,0,0,NULL);
   AfxBeginThread(hilo2,&m_list1,THREAD_PRIORITY_HIGHEST,0,0,NULL);

Al hacer la conversion:

Código: Seleccionar todo
UINT hilo1( LPVOID pParam )
{
   CListBox *lista = (CListBox*)pParam;
   while(TRUE)
   {
            if(IsWindow(lista->m_hWnd))
             {
      lista->AddString("Hilo 1");
      lista->SetScrollPos(SB_VERT,10000,TRUE);
      Sleep(400);
            }
   }
}
Imagen
Avatar de Usuario
latindeveloper
Administrador
Administrador
 
Mensajes: 1061
Registrado: Lun Jun 02, 2003 8:29 pm
Ubicación: Peru

Notapor kikers25 el Sab Nov 19, 2005 12:01 pm

Gracias por seguir contestar.

El ejercicio del boton y del listbox, en el que al dar un boton se crean dos hilos que escriben en el listbox es un ejercicio que lo estaba usando para probar.
Mi problema real es que tengo hecho en MFC una aplicacion que es parecido a un mini-messenger con el que me conecto a una sola persona. En la pantalla principal tengo dos listbox:uno para la conversacion y otro donde voy escribiendo las primitivas del nivel de enlace que recibo y envio. Cada vez que quiero escibir en cualquiera de los dos listbox envio un mensaje a la aplicacion que es la que se encarga de escribirlo realmente, pero hay algunos mensajes que no se escriben en los listbox y no tengo ni idea de porque es y necesito que se escriban todos los mensajes.

INFORMACION:
Casi todos los mensajes para escribir en los listbox se envian desde hilos donde a cada hilo le mando como parámetro un HWND de la ventana. Todos los mensajes se envian con SendMessage, y al procesarlos se usa InserString en vez de AddString que al parecer si no se ordenada el listbox es mejor.
La funcion que maneja estos mensajes recibe dos parámetros uno para saber en que listbox escribir y otro para saber que es lo que tiene que escribir; la funcion tiene dos static para saber el numero de línea en el que tengo que escribir.

Creo que el problema es que hay dos mensajes que se envian a la vez y solo llega uno, pero no lo sé al 100%
Espero que alguien me pueda ayudar porque me estoy volviendo loco
kikers25
Novato
Novato
 
Mensajes: 5
Registrado: Mié Nov 16, 2005 5:39 am


Volver a Visual C++

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado