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 en MFC con la funcion AfxBeginThread

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

Moderador: latindeveloper

Hilos en MFC con la funcion AfxBeginThread

Notapor antony el Jue Ene 01, 2004 9:18 pm

Tengo problemas al crear dos hilos donde en cada uno de ellos utilizo matrices dinamicas creadas fuera de los hilos, pero utilizo un aputador this como argumento en AfxBeginThread, para tener acceso a la matriz. Al ir cambiando el contenido de la matriz en cada hilo mediante operaciones simples, me aparece un mensaje de error el cual dice que estoy tratando de escribir en un espacio de memoria que es de solo lectura. Cual seria el posible error que estoy cometiendo?
antony
Novato
Novato
 
Mensajes: 1
Registrado: Jue Ene 01, 2004 9:05 pm

Re: Hilos en MFC con la funcion AfxBeginThread

Notapor latindeveloper el Mar Mar 30, 2004 1:43 am

Hola antony

La funcioncita que manipula tus matrices (clases) debe ser declara como sigue:

Código: Seleccionar todo
UINT ManipularLaMatriz( LPVOID pParam )
{
    CMatriz* pMatriz = (CMatriz*)pParam;

    if (pMatriz == NULL)
       return 1;   // horror!

    while(true){
      //no intenten esto en casa
    }
    return 0;   // ok
}


Ahora dentro de tu clase donde operas tus matrices debes escribir algo como:

Código: Seleccionar todo
void CAlgunaClase::OperarNuevaMatriz()
{
    if(m_pMatriz == NULL)
    {
        m_pMatriz = new CMatriz(n,m);
    }
    AfxBeginThread(ManipularLaMatriz, m_pMatriz);
}

Notarás que esto funciona para una sola matriz, para muchas matrices puedes hacer algo como:

Código: Seleccionar todo
void CAlgunaClase::OperarNuevaMatriz()
{
    m_pMatrices[m_iCount] = CMatriz(n,m);
    AfxBeginThread(ManipularLaMatriz, &m_pMatrices[m_iCount]);
    m_iCount++;
}

Debes tener mucho cuidado con el manejo de la memoria y los limites de tus variables.

No es la mejor forma pero sirve... para que el manejo de tus matrices sea mas optimo puedes controlarlos mediante listas o alguna estructura que no te permita perder su referencia y asi poder eliminarlos cuando y donde sea conveniente.

Cualquier duda por este medio.
Avatar de Usuario
latindeveloper
Administrador
Administrador
 
Mensajes: 1061
Registrado: Lun Jun 02, 2003 8:29 pm
Ubicación: Peru

Notapor jmcordoba el Mié Sep 05, 2007 8:37 am

Hola,

estoy intentando abrir una base de datos únicamente para leerla desde un hilo creado con AfxBeginThread, pero me da error al abrirla. Probada desde el hilo principal del programa no hay ningún problema. Aquí teneis el código:

UINT ThreadOperacio(LPVOID pParam)
{
SThreadBack *pObject = (SThreadBack*) pParam;

pObject->proces = TRUE;

do
{
pObject->pAutomation->BBDD();

}while(pObject->exit == FALSE);

//Indiquem que s'ha acabat l'execució.
pObject->proces = FALSE;

return 0;
}

void CAutomation::BBDD()
{
CMiDaoDatabase dbData;
CDaoRecordset *rsData;

CString sAux, sDest;
int iRet;

sDest=m_sPathAccess;
sDest=sDest + "Comparaciones";

sAux.Format("%s.MDB",sDest);

iRet=dbData.Open(sAux, FALSE, FALSE);

sAux = "Select * from SAnulaciones;";

rsData = new CDaoRecordset(&dbData);
rsData->Open(dbOpenDynaset,sAux);

delete rsData;

dbData.Close();
}

Si alguien tiene alguna idea estaría muy agradecido. Quiero aprovechar para animar a todos aquellos que ayudan a gente como yo. Un saludo!
jmcordoba
Novato
Novato
 
Mensajes: 11
Registrado: Mié Nov 15, 2006 9:48 am


Volver a Visual C++

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados