|
| Autor |
Mensaje |
sebarrr Usuario Iniciado

Registrado: 17 Sep 2009 Mensajes: 18 Ubicación: Madrid
|
|
| Volver arriba |
|
|
sebarrr Usuario Iniciado

Registrado: 17 Sep 2009 Mensajes: 18 Ubicación: Madrid
|
Publicado: Lun 12 Oct, 2009 21:49 pm
Título del mensaje: Re: Threads en aplicación MFC |
|
|
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 |
|
|
WhiteSkull Moderador Global

Registrado: 20 Mar 2009 Mensajes: 2084 Ubicación: y*width+x
|
|
| Volver arriba |
|
|
sebarrr Usuario Iniciado

Registrado: 17 Sep 2009 Mensajes: 18 Ubicación: Madrid
|
Publicado: Mar 13 Oct, 2009 22:54 pm
Título del mensaje: Re: Threads en aplicación MFC |
|
|
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 |
|
|
WhiteSkull Moderador Global

Registrado: 20 Mar 2009 Mensajes: 2084 Ubicación: y*width+x
|
|
| Volver arriba |
|
|
sebarrr Usuario Iniciado

Registrado: 17 Sep 2009 Mensajes: 18 Ubicación: Madrid
|
Publicado: Mie 14 Oct, 2009 01:35 am
Título del mensaje: Re: Threads en aplicación MFC |
|
|
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 |
|
|
sebarrr Usuario Iniciado

Registrado: 17 Sep 2009 Mensajes: 18 Ubicación: Madrid
|
|
| Volver arriba |
|
|
WhiteSkull Moderador Global

Registrado: 20 Mar 2009 Mensajes: 2084 Ubicación: y*width+x
|
|
| Volver arriba |
|
|
sebarrr Usuario Iniciado

Registrado: 17 Sep 2009 Mensajes: 18 Ubicación: Madrid
|
Publicado: Mie 14 Oct, 2009 15:51 pm
Título del mensaje: Re: Threads en aplicación MFC |
|
|
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 |
|
|
WhiteSkull Moderador Global

Registrado: 20 Mar 2009 Mensajes: 2084 Ubicación: y*width+x
|
Publicado: Mie 14 Oct, 2009 16:50 pm
Título del mensaje: Re: Threads en aplicación MFC |
|
|
Seguro que eres un telequillo.. ja ja ja
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
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 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  |
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 |
|
|
sebarrr Usuario Iniciado

Registrado: 17 Sep 2009 Mensajes: 18 Ubicación: Madrid
|
Publicado: Jue 15 Oct, 2009 00:45 am
Título del mensaje: Re: Threads en aplicación MFC |
|
|
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 |
|
|
sebarrr Usuario Iniciado

Registrado: 17 Sep 2009 Mensajes: 18 Ubicación: Madrid
|
|
| Volver arriba |
|
|
sebarrr Usuario Iniciado

Registrado: 17 Sep 2009 Mensajes: 18 Ubicación: Madrid
|
|
| Volver arriba |
|
|
WhiteSkull Moderador Global

Registrado: 20 Mar 2009 Mensajes: 2084 Ubicación: y*width+x
|
Publicado: Vie 16 Oct, 2009 03:22 am
Título del mensaje: Re: Threads en aplicación MFC |
|
|
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 |
|
|
sebarrr Usuario Iniciado

Registrado: 17 Sep 2009 Mensajes: 18 Ubicación: Madrid
|
|
| Volver arriba |
|
|