Fecha y hora actual: Sab 19 May, 2012 22:17 pm
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

Threads en aplicación MFC

Responder al Tema Ir a página 1, 2  Siguiente

Índice del Foro > C, C#, Visual C++ > Threads en aplicación MFC

Autor Mensaje
sebarrr
Usuario Iniciado


Registrado: 17 Sep 2009
Mensajes: 18
Ubicación: Madrid

Mensaje Publicado: Lun 12 Oct, 2009 21:43 pm

Título del mensaje: Threads en aplicación MFC

Responder citando

Hola,

en mi aplicación MFC al pulsar un botón se inicia un proceso que abre un socket y queda a la espera de contestación.
Estaba hecho así a pelo pero el interfaz gráfico quedaba bloqueado mientras se estaba a la espera... lógico.


Así que me he lanzado a usar hebras Super . Con la clase CWinTread.

Muy simple. Tengo:

hebras.h
Código:

#include "SubscriptionSessionManager2.h"

class SubscriptionThread: public CWinThread {
public:
   SubscriptionThread();
   virtual ~SubscriptionThread();
   virtual bool InitInstace();
   virtual int Run();
   SubscriptionSessionManager2 sesion;
};

hebras.cpp
Código:

include "stdafx.h"
#include "hebras.h"


bool SubscriptionThread::InitInstace(){
   return true;
}

int SubscriptionThread::Run(){   
   sesion.InitializeSubscription();
   return 0;
}


Y en mi aplicación:
Código:

...
#include "hebras.h"
...
SubscriptionThread* subT=new SubscriptionThread();
...
void COSSPhoneMFCDlg::OnBnClickedButtonSub()
{
   ...   
   subT->CreateThread();
                ...
}


Al compilarlo, con Visual Studio 2005, me da el siguiente error de linkado:

>OSSPhoneDlg.obj : error LNK2019: unresolved external symbol "public: __thiscall SubscriptionThread::SubscriptionThread(void)" (??0SubscriptionThread@@QAE@XZ) referenced in function "void __cdecl `dynamic initializer for 'subT''(void)" (??__EsubT@@YAXXZ)


Qué puede ser? Llorón



Ultima edición por sebarrr el Lun 12 Oct, 2009 21:50 pm; editado 1 vez
Volver arriba
Ver perfil del usuario Enviar mensaje privado
sebarrr
Usuario Iniciado


Registrado: 17 Sep 2009
Mensajes: 18
Ubicación: Madrid

Mensaje Publicado: Lun 12 Oct, 2009 21:49 pm

Título del mensaje: Re: Threads en aplicación MFC

Responder citando

Por cierto, no es nada que se arregle tocando la opción esa de Runtime library.

Está a MultiThreaded DLL Debug (/MDd) y también he probado las demás opciones.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
Moderador Global


Registrado: 20 Mar 2009
Mensajes: 2084
Ubicación: y*width+x

Mensaje Publicado: Mar 13 Oct, 2009 21:17 pm

Título del mensaje: Re: Threads en aplicación MFC

Responder citando

mmm Podría ser debido a incompatibilidad de los argumentos de esas funciones.. es posible que estés usando una librería hecha en Borland... si fuera el caso tendrías que modificar las declaraciones del include... pero no lo se al 100%.. dame tiempo para confirmarlo


http://www.youtube.com/watch?v=-lT1zCukNQY
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
sebarrr
Usuario Iniciado


Registrado: 17 Sep 2009
Mensajes: 18
Ubicación: Madrid

Mensaje Publicado: Mar 13 Oct, 2009 22:54 pm

Título del mensaje: Re: Threads en aplicación MFC

Responder citando

Te refieres a la librería que contiene la clase CWinThread??
Porque yo ésa la he usado directamente del Visual Studio... ni siquiera he tenido que hacer ningún include.

De todas formas, qué otra cosa (clase, librería, método) puedo usar para tener 2 procesos en paralelo y que el bucle de los sockets no deje "pillado" al interfaz gráfico??

Gracias

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
Moderador Global


Registrado: 20 Mar 2009
Mensajes: 2084
Ubicación: y*width+x

Mensaje Publicado: Mie 14 Oct, 2009 00:19 am

Título del mensaje: Re: Threads en aplicación MFC

Responder citando

No, no creo, esa pertenece al microsoft...

Pásame el proyecto en un zip please... que estás estudiando? programación multihilo?


http://www.youtube.com/watch?v=-lT1zCukNQY
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
sebarrr
Usuario Iniciado


Registrado: 17 Sep 2009
Mensajes: 18
Ubicación: Madrid

Mensaje Publicado: Mie 14 Oct, 2009 01:35 am

Título del mensaje: Re: Threads en aplicación MFC

Responder citando

No, no estudio nada (de programación).


Simplemente es un programa que tiene que funcionar, como parte importante de mi proyecto Fin de Carrera.

Creo q pasarte el project de momento es inviable: muy largo (unos 800MB sin comprimir) además de tener bastantes referencias... vamos que te llevaría un tiempo, creo, tenerlo todo funcionando.

¿Qué quieres comprobar exactamente? Si puedo mirártelo...

Volver arriba
Ver perfil del usuario Enviar mensaje privado
sebarrr
Usuario Iniciado


Registrado: 17 Sep 2009
Mensajes: 18
Ubicación: Madrid

Mensaje Publicado: Mie 14 Oct, 2009 02:34 am

Título del mensaje: Re: Threads en aplicación MFC

Responder citando

Por cierto, he hecho esta prueba. Yo lo flipo Ojos

He creado una aplicación MFC (basada en dialogo... es un flag, lo único q he tocado respecto a la config x defecto) y me dispongo a usar una clase Mihebra, que hereda CWinThread y no hace nada (el InitInstance devuelve true y el run() he probado bien que no haga nada bien ni ponerlo) y resulta q...


tampoco LINKA!!!!!


Podéis probarlo??

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
Moderador Global


Registrado: 20 Mar 2009
Mensajes: 2084
Ubicación: y*width+x

Mensaje Publicado: Mie 14 Oct, 2009 15:11 pm

Título del mensaje: Re: Threads en aplicación MFC

Responder citando

800 megas de proyeto!!! Tío, me apuesto todo lo que quieras a que el 90% no es código Risa

A ver sebarr... si no estudias programación, dará igual que sustituyas los hilos por un sencillo timer, no? Los resultados son casi idénticos, siendo el timer mucho más preciso, pero menos eficiente...

Observa ésta pequeña demo que hice, para que observes. Combino una barra de progreso que usa un proceso Thread y otra barra de progreso que usa Timer.

http://rapidshare.com/files/292893643/MultiHebra.zip.html
MD5: 4BDC343ECC91AC40924912E18F0804DF


http://www.youtube.com/watch?v=-lT1zCukNQY
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
sebarrr
Usuario Iniciado


Registrado: 17 Sep 2009
Mensajes: 18
Ubicación: Madrid

Mensaje Publicado: Mie 14 Oct, 2009 15:51 pm

Título del mensaje: Re: Threads en aplicación MFC

Responder citando

Je, je...

pues no te creas, para mi que si que es todo código.

Pero no hecho por mi, evidentemente, sino que es código libre que implementa un teléfono de VoIP.
Yo sólo le estoy añadiendo un nuevo servicio... muy friki todo

Pues esta noche le echo un ojo a eso de los timers, q ahora estoy en el curro.

Pero, si lo que quiero es q en paralelo se esté ejecutando el interfaz gráfico y un bucle (q está ahí ejecutándose a la espera de que te llegue algo por un puerto UDP), sirven los timers??

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
Moderador Global


Registrado: 20 Mar 2009
Mensajes: 2084
Ubicación: y*width+x

Mensaje Publicado: Mie 14 Oct, 2009 16:50 pm

Título del mensaje: Re: Threads en aplicación MFC

Responder citando

Seguro que eres un telequillo.. ja ja ja Risa

Mira te voy a explicar cómo crear tareas Thread y tareas Timer en VC++ 2008, luego tú decide que usar y cómo implementarlo.

Thread

Visual Studio trae un componente que se llama Threading (Hebrando o Hilando), para ello lo incluimos dentro de nuestro namespace o espacio de trabajo. Si, junto a todos esos using namespace System; using no se que y todo eso...

using namespace System::Threading;

después, en una línea más abajo creamos un método delegado...

delegate void DelegarTareaDelHilo();

Luego debemos incluir un miembro puntero Thread para la clase tejedora...

Thread ^hilo; // Antiguamente o en otros C++ "Thread *hilo;"


Luego creamos la tarea o proceso, en ella deberemos delegar al comienzo, pero sólo puede hacerse una vez al comenzar el proceso o tarea. Entonces mediante una condición y una variable que actúe de bandera o mediante algún método booleano del objeto que vayamos a usar, podemos solucionar eso.

Código:
DelegarTareaDelHilo ^HiloDelegado = gcnew DelegarTareaDelHilo(this ,&Form1::tarea); // gcnew, antiguamente o en otras versiones cómo "new"
this->Invoke(HiloDelegado);


En teoría la tarea se ejecuta en un bucle infinito, entonces, podemos meterlo todo dentro de un while(true) , pero para clarificar el código creamos una función llamada bucle, o bucleInfinito, o repeticion o repite, o lo que sea, de esa forma podremos controlar mucho mejor la prioridad del proceso, usando un Sleep para dormitarlo durante un rato.

Código:
      void repite(){   
         while(true)
         {
            tarea(); // Ejecutamos la tarea
            Thread::Sleep(100); // Le damos un respiro de 100 milisegundos :)
         }
      }


Y ya por último, sólo nos falta comenzar el hilo, ponerlo en marcha, para ello podemos usar un boton click, cómo creo que estabas haciendo... o en cualquier evento...

Código:
            ThreadStart ^HiloDelegado = gcnew ThreadStart(this, &Form1::repite); // "repite" es el hilo que trabajará independientemente de los demás procesos
            hilo = gcnew Thread(HiloDelegado);
            hilo->IsBackground = true; // Se ejecuta en modo de segundo plano
            hilo->Start(); // Comienza el proceso del hilo


Pero claro, habrá que tener cuidado cuando cerremos el form, ya que el proceso podría continuar a su bola, entonces deberiamos usar una sencilla condición, que podemos incluir en el destructor o algún evento de cierre.

if (hilo->IsAlive) hilo->Abort(); // Si el hilo sigue vivo, lo abortamos

Ya está... buff cuanto teclear... me sudan las manos Risa


Timer

Ésto lo podemos hacer mayormente de forma visual. Sólo hay que arrastras un componente llamado timer, que se encuentra en el cuadro de las herramientas con icono de un cronómentro, junto al TextBox. Una vez arrastrado al form y desde la vista visual, hacemos doble click sobre el dibujito del cronómetro. Aparecerá código, al igual que con un boton click. Aquí veremos algo así...

Código:
private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e) {
          otratarea(); // Aquí ponemos nuestra función de tareas o proceso
       }



Después de haber introducido el nombre de la función que realiza la tarea o el proceso. Tendremos que inicializar o arrancarla, al igual que pasaba con el Thread. Para ello vamos a un evento cualquiera, por ejemplo en un botón click Guiño e introducimos las siguientes líneas...

Código:
            //ejecutamos otra tarea que usa el componente timer para ejecutarse
            // a los 100 intervalos
            timer1->Enabled=true;
            timer1->Interval=100;


Fíjate que Interval aquí funciona de manera similar al Sleep...

Fin... seguro que de ésta forma no te ocupa 800 megas... jajajaj venga sebarr suerterrr con tu proyectorrr Ok


http://www.youtube.com/watch?v=-lT1zCukNQY


Ultima edición por WhiteSkull el Jue 15 Oct, 2009 11:30 am; editado 1 vez
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
sebarrr
Usuario Iniciado


Registrado: 17 Sep 2009
Mensajes: 18
Ubicación: Madrid

Mensaje Publicado: Jue 15 Oct, 2009 00:45 am

Título del mensaje: Re: Threads en aplicación MFC

Responder citando

Gracias tio, eres un puto crack!

Hoy tengo un poco de sueño, no sé si podré hacer algo pero por lo que veo tiene muy buena pinta. Y al ser más específico de Visual espero q funcione y le vayan dando x cul.. a CWinThread

Volver arriba
Ver perfil del usuario Enviar mensaje privado
sebarrr
Usuario Iniciado


Registrado: 17 Sep 2009
Mensajes: 18
Ubicación: Madrid

Mensaje Publicado: Jue 15 Oct, 2009 23:28 pm

Título del mensaje: Re: Threads en aplicación MFC

Responder citando

Hey White,

el namespace System no existe en las aplicaciones MFc de Visual Studio.
Tampoco el la tool Timer está disponibler en el Toolbox Triste

Recuerdo, de otros intentos que hice hace un tiempo para esta misma aplicación, que esto si estaba disponible para projects tipo CLR - Windows Applications Forms.

No hay una forma de solucionarlo?? No se puede añadir el System de alguna forma?

Volver arriba
Ver perfil del usuario Enviar mensaje privado
sebarrr
Usuario Iniciado


Registrado: 17 Sep 2009
Mensajes: 18
Ubicación: Madrid

Mensaje Publicado: Jue 15 Oct, 2009 23:47 pm

Título del mensaje: Re: Threads en aplicación MFC

Responder citando

Hey! Tito google me dio la solución:

Si en Propiedades de proyecto -> Propiedades de Configuración -> General, habilito el Common Language Runtime Support (/clr)

aparece el System con el Threading y to la pesca Risa

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
Moderador Global


Registrado: 20 Mar 2009
Mensajes: 2084
Ubicación: y*width+x

Mensaje Publicado: Vie 16 Oct, 2009 03:22 am

Título del mensaje: Re: Threads en aplicación MFC

Responder citando

Cierto!!! Claro tu con esa cosa híbrida entre CLR y MFC... Lo siento... Me he puesto a transcribir el código, y no veas que coñazo... Con decirte que ya son las 2 de la mañana y ni me he dado cuenta...

Bueno, aquí va Timer para aplicaciones MFC, he tenido que mirar un par de páginas buenas para darme cuenta que no hay tanta diferencia. Mira y observa. Para ello he usado un Dialogo de ejemplo que me ha creado el VC++. Luego en el formulario principal, en éste caso cómo antes dije un diálogo, he introducido un barra de progreso y creo una tarea para la barra de progreso...

Código:
...
...
/////////////////////////////////////////////////////////////////////////////
// CEjemploDlg dialog

class CEjemploDlg : public CDialog
{
   CProgressCtrl *BarraDeProgreso;
// Construction
   void tarea(){

          if (BarraDeProgreso->StepIt()>=50)
          Sleep(100); // Esto es una pequeña pausa para la animación...
          // ... de la barra de progreso y puede ser omitida....
          BarraDeProgreso->StepIt();
   }
...


Bien ya tenemos la tarea, ahora buscamos un evento para inicializar el 'crono' , yo en éste caso he recurrido al OnInitDialog, bajamos y casi al final, (normalmente cuando creamos en VC 6 nos da la opción de dejar comentarios por default, que nos indica partes claves del programa) introducimos el SetTimer que arranca el 'crono' y envía evento OnTimer al completar el intervalo especificado previamente.

Código:
/////////////////////////////////////////////////////////////////////////////
// CEjemploDlg message handlers

BOOL CEjemploDlg::OnInitDialog()
{
   CDialog::OnInitDialog();
      
   // Add "About..." menu item to system menu.

   // IDM_ABOUTBOX must be in the system command range.
   ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
   ASSERT(IDM_ABOUTBOX < 0xF000);

   CMenu* pSysMenu = GetSystemMenu(FALSE);
   if (pSysMenu != NULL)
   {
      CString strAboutMenu;
      strAboutMenu.LoadString(IDS_ABOUTBOX);
      if (!strAboutMenu.IsEmpty())
      {
         pSysMenu->AppendMenu(MF_SEPARATOR);
         pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
      }
   }

   // Set the icon for this dialog.  The framework does this automatically
   //  when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);         // Set big icon
   SetIcon(m_hIcon, FALSE);      // Set small icon
   
   // TODO: Add extra initialization here
        // De paso arranco el objeto BarraDeProgreso
   CProgressCtrl *BP=(CProgressCtrl *)GetDlgItem(IDC_PROGRESS1);
   BarraDeProgreso=BP;
   BarraDeProgreso->SetRange(0, 50);
   BarraDeProgreso->SetStep(1);

        // Arrancamos el Timer con un intervalo de 100 milisegundos
        // el primer y ultimo parametro no se lo que hace, pero así funciona..
   SetTimer(1,100,0);
   
   return TRUE;  // return TRUE  unless you set the focus to a control
}
...
...


Y por último creamos el evento OnTimer dentro de nuestro ámbito o clase y llamamos la función donde marcha la tarea, en éste caso llamada y valgame la redundancia, tarea...

Código:
void CEjemploDlg::OnTimer(UINT nIDEvent)
{
   // TODO: Add your message handler code here and/or call default
   //TACHAAANN
        tarea();   
      
   CDialog::OnTimer(nIDEvent);
}
...
...


Ves chaval, que fácil... y con menos líneas... te adjunto un ejecutable para que veas cómo me salió, más feo y cutre... pero funciona q coño...

http://rapidshare.com/files/293573081/Ejemplo.zip.html
MD5: 1C9A0FE75910D87A58FFD7CBD6C52936


http://www.youtube.com/watch?v=-lT1zCukNQY
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
sebarrr
Usuario Iniciado


Registrado: 17 Sep 2009
Mensajes: 18
Ubicación: Madrid

Mensaje Publicado: Jue 22 Oct, 2009 03:07 am

Título del mensaje: Re: Threads en aplicación MFC

Responder citando

Hola.

Ante todo gracias por tus desinteresadas aportaciones. Perdona por haber tardado en contestar pero es q estoy de viaje de trabajo (en Irlanda Ojos ) y ando muy liado (y lo q nos queda...)

Bueno, al lio, mirando tu codigo y ejecutable varias cosas:

1. Lo de la barra de proceso es prescindible no? La clave parece estar en llamar al metodo tarea() desde el OnTimer() no?... habiendo antes iniciado "el crono" con el SetTimer()

2. Lo he probado y al menos me compila y linka (un avance Ruborizado ) pero no funciona. Nunca entra en OnTimer() para llamar a tarea!!!

3. En tu ejemplo, aunq no salga ahí tu has tenido que definir la cabecera de OnTimer() en CEjemploDlg.h. ¿Cómo lo has hecho, como virtual o alguna movida rara?

Nunca funciona nada... Llorón Llorón Llorón ¿A ver si va a ser mi Visual?
Puedes pasarme tu project, guardado como 2005 (creo q tu tenías el 2008), pa ver si lo compilo y me funciona

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Responder al Tema Ir a página 1, 2  Siguiente
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

Ayuda... aplicación Java con bbdd para web

Miguelon Java 1 Mar 27 Mar, 2012 20:15 pm Ver último mensaje
El foro no contiene ningún mensaje nuevo

Aplicación web en ASP.NET MVC

lako27 ASP, ASP.NET 2 Mar 13 Mar, 2012 14:12 pm Ver último mensaje
El foro no contiene ningún mensaje nuevo

necesito programador para aplicacion escritorio

TyS Java 1 Mar 14 Feb, 2012 18:39 pm Ver último mensaje
El foro no contiene ningún mensaje nuevo

Exportar aplicacion

DuendeManchego Programación en general 1 Mie 08 Feb, 2012 12:54 pm Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,