• Miércoles 8 de Mayo de 2024, 12:49

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - Cat

Páginas: [1]
1
Visual C++ / User Interface Thread Y Mensajes (messages)
« en: Martes 25 de Mayo de 2004, 14:18 »
Pues el problema que tengo es que mi aplicación crea 2 Threads a partir de una clase que hereda de CWinThread, llamada CHebraPrincipal. Las creo asi:

m_Thread1 = (CHebraPrincipal *) AfxBeginThread(RUNTIME_CLASS(CHebraPrincipal),THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);

m_Thread2 = (CHebraPrincipal *) AfxBeginThread(RUNTIME_CLASS(CHebraPrincipal),THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);

siendo m_Thread1 y m_Thread2 de tipo CHebraPrincipal *.

Las hebras funcionan, es decir, las creo suspendidas, inicializo sus variables y despues llamo al metodo ResumeThread() de cada una de ellas y se ejecutan (comprobado).

La cuestion es que quiero que entre ella se manden Mensajes (Messages). Para ello en la clase CHebraPrincipal tengo lo siguiente:
 - En el fichero .h, las funciones que manejaran los mensajes:

//{{AFX_MSG(CHebraPrincipal)
  // NOTE - the ClassWizard will add and remove member functions here.
  afx_msg void getThreadId(WPARAM wParam, LPARAM lParam);
  afx_msg void comunicacionThread(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG


 - En el .cpp el mapa de mensajes:
BEGIN_MESSAGE_MAP(CHebraPrincipal, CWinThread)
//{{AFX_MSG_MAP(CHebraPrincipal)
  // NOTE - the ClassWizard will add and remove mapping macros here.
  ON_REGISTERED_THREAD_MESSAGE(nMsg1Id,getThreadId)
  ON_REGISTERED_THREAD_MESSAGE(nMsg2Id,comunicacionThread)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

  Las variables nMsg1Id y nMsg2Id son de tipo UINT y las inicializo en el metodo InitInstance() de la siguiente forma:

nMsg1Id = RegisterWindowMessage("Mensaje1Thread");
m_nMsg1Id = nMsg1Id;
nMsg2Id = RegisterWindowMessage("Mensaje2Thread");
m_nMsg2Id = nMsg2Id;

 Las variables m_nMsg1Id y m_nMsg2Id son variables miembro publicas UINT para poder hacer los post de los mensajes.



Desde el programa principal, tras crear los Thread suspendidos, los inicializo asi:

  m_Thread1->m_ThreadSecundarioId = m_Thread2->m_nThreadID;
  m_Thread1->m_ThreadSecundario = m_Thread2;
  m_Thread2->m_ThreadSecundarioId = m_Thread1->m_nThreadID;
  m_Thread2->m_ThreadSecundario = m_Thread1;

Es decir: a cada uno le paso el ID y el puntero del otro para que pueda postearle mensajes.

Pues con todo esto, en el metodo Run() (que se ejecuta) hago lo siguiente:

::PostThreadMessage(m_ThreadSecundarioId,m_ThreadSecundario->m_nMsg2Id,0,0);

y el otro Thread no ejecuta el metodo que debe atender el mensaje (parece que no le llegan).


PD: Se que esto planteado de esta forma puede ser un poco lioso. Solo espero que alguien que pase por aqui y que pueda ayudar y este puesto en el tema de Threads y Mensajeria pues ayude :)

2
Visual C++ / Timers En Dlls
« en: Jueves 20 de Mayo de 2004, 13:48 »
Mi duda es la siguiente:
¿Se pueden utilizar Timers dentro de una DLL de Extensión?.

Utilizarlos en un .EXE si se puede perfectamente, pero he intentado hacer exactamente lo mismo en una DLL de Extensión y el evento del Timer no se dispara. La cuestión es que a la hora de llamar a SetTimer(...) no se produce error alguno.

Como detalle, comentar que el Visual Studio por ejemplo, a la hora de poner un timer en un .EXE se puede poner con las opciones de añadir los mensajes y demás. En cambio en una DLL el mensaje WM_TIMER no está para poder ser añadido (aunque a mano se puede).

Espero si alguien me responde :)

Páginas: [1]