• Lunes 23 de Diciembre de 2024, 05:30

Autor Tema:  dudas sobre threads  (Leído 1841 veces)

dinl

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
dudas sobre threads
« en: Miércoles 10 de Diciembre de 2008, 01:10 »
0
Hola a todos!, miren he estado tratando de programar con hilos en c++ pero aun tengo dudas, por ejemplo, si en un momento deseo parar la ejecucion de un thread que funcion o procedimiento utilizo?, tambien como puedo iniciar un hilo fuera del main, es eso posible?.

Código: Text
  1.  
  2. #include <iostream>
  3. #include <stdio.h>
  4. #include <time.h>
  5. #include <windows.h>
  6.  
  7. using namespace std;
  8.  
  9. void reloj ( int seconds )
  10. {
  11.   clock_t endwait;
  12.   endwait = clock () + seconds * CLOCKS_PER_SEC ;
  13.   while (clock() < endwait) {}
  14. }
  15.  
  16. void conteo(){
  17.     int n;
  18.       printf ("Starting countdown...n");
  19.       for (n=0; n<99; n++)
  20.       {
  21.         printf ("%dn",n);
  22.         reloj(1);
  23.         system("cls");
  24.       }
  25.       printf ("FIRE!!!n");
  26. }
  27.  
  28. void relleno(){
  29.     int opcion,control=1;
  30.     while(control){
  31.     cin >> opcion;
  32.     if(opcion==5){
  33.         control=0;
  34.     }
  35.     }
  36. }
  37.  
  38. void RunDialogOne();
  39. void RunDialogTwo();
  40.  
  41. HANDLE tPrimary, tSecond;
  42.  
  43. void RunDialogTwo(){
  44.     // WaitForSingleObject(tPrimary, INFINITE);
  45.     conteo();
  46.     return;
  47. }
  48.  
  49. void RunDialogOne(){
  50.     relleno();
  51.     return;
  52. }
  53.  
  54. int main ()
  55. {
  56.     DWORD ThreadID;
  57.  
  58.     tPrimary = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RunDialogOne, NULL, CREATE_SUSPENDED, &ThreadID);
  59.     tSecond = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RunDialogTwo, NULL, CREATE_SUSPENDED, &ThreadID);
  60.     ResumeThread(tPrimary);
  61.     ResumeThread(tSecond);
  62.  
  63.     HANDLE ThreadContainer[2];
  64.     ThreadContainer[0] = tPrimary;
  65.     ThreadContainer[1] = tSecond;
  66.  
  67.     DWORD dwSuccess = WaitForMultipleObjects(2, ThreadContainer, TRUE, INFINITE);
  68.     if (dwSuccess == WAIT_FAILED)
  69.         MessageBox(NULL, "Espera a fallado!", "ERROR", MB_OK | MB_ICONERROR);
  70.     else
  71.         MessageBox(NULL, "Exito!", "EXITO", MB_OK | MB_ICONINFORMATION);
  72.  
  73.     CloseHandle(tPrimary);
  74.     CloseHandle(tSecond);
  75. return 0;
  76.  
  77. }
  78.  
  79.  
este fue un codigo que encontre y he modificado a trozos, pero no se que mas hacerle y en la web la documentacion no es muy clara. de antemano muchas gracias

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: dudas sobre threads
« Respuesta #1 en: Miércoles 10 de Diciembre de 2008, 01:23 »
0
Para parar un hilo podes usar SuspendThread. Y un hilo puede ser creado desde cualquiera parte del codigo (usando CreateThread).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

dinl

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: dudas sobre threads
« Respuesta #2 en: Miércoles 10 de Diciembre de 2008, 01:34 »
0
mmmm, pero al utilizar SuspendThread() en los argumentos coloco tSecond pero no me funciona, como hago ahi?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: dudas sobre threads
« Respuesta #3 en: Miércoles 10 de Diciembre de 2008, 08:11 »
0
Depuralo, fijate que valor tiene el HANDLE que pasas y que valor toma el Last Error.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

rfog

  • Miembro MUY activo
  • ***
  • Mensajes: 166
    • Ver Perfil
Re: dudas sobre threads
« Respuesta #4 en: Jueves 11 de Diciembre de 2008, 19:33 »
0
Hola a todos.

Debido a un bug histórico en el runtime de C de Microsoft, no se debe usar CreateThread para lanzar un hilo, sino _beginthreadex, que toma los mismo parámetros.

El asunto está en que si se usa la primera función, el runtime de C no se inicializa correctamente y ciertas llamadas a la biblioteca de C pueden producir efectos laterales no deseados, mientras que con la segunda la inicialización es correcta. Si no se usara ninguna función del runtime no habría problema en hacerlo con CreateThread, pero como el propio startup de cualquier programa escrito en C++ lo usa, es necesario hacerlo así.

Aquí: http://msdn.microsoft.com/en-us/library/ms682453.aspx, casi al final de todo, se menciona algo sobre esto.
Microsoft Visual C++ MVP - Mi blog sobre programación: http://geeks.ms/blogs/rfog

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: dudas sobre threads
« Respuesta #5 en: Jueves 11 de Diciembre de 2008, 19:48 »
0
¿Alguna vez tuviste ese problema? Segun la explicacion solo podria haber un problema si fallara la reserva de memoria del TID (creo que era menos de una pagina su tamaño) y de ser asi solo seria un sintoma de un problema mucho mas grave.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

rfog

  • Miembro MUY activo
  • ***
  • Mensajes: 166
    • Ver Perfil
Re: dudas sobre threads
« Respuesta #6 en: Jueves 11 de Diciembre de 2008, 19:58 »
0
Eternal, nunca la tuve porque nunca usé CreateThread por lo dicho. Siempre lo he hecho con _beginthreadex.

¿Con TID te refieres a TLS? Thread Local Storage. Si te refieres a eso, sí, el problema viene de ahí, y es más gordo en la versión DLL que en la estática, ya que el almacenamiento local no se inicializa bien y funciones con variables estáticas (como por ejemplo strtok) fallan estrepitosamente y hasta podrían tumbar la aplicación.

Si TID es otra cosa, ni idea de lo que es.
Microsoft Visual C++ MVP - Mi blog sobre programación: http://geeks.ms/blogs/rfog

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: dudas sobre threads
« Respuesta #7 en: Jueves 11 de Diciembre de 2008, 21:15 »
0
Bueno, yo lo use miles de veces y jamas tuve ningun problema (ojo siempre hablo de versiones >= 7.1 - .NET 2003 - y siendo que decis que es un bug historico muy probablemente tenga que ver con versiones obsoletas como la 6.0 - no veo que strtok use ninguna variable estatica en la version 8.0 de la CRT - ).

No, con TID me refiero a la estructura que nombran en uno de los comentarios (es _ptiddata). El problema que mencionan puede suceder cuando se intenta reservar memoria para esta estructura y no es posible hacerlo; el slot de TLS solo se usa para almacenar el puntero a la misma. En realidad el TLS no es reservado por la CRT sino por el propio Kernel (es parte del TEB) al crear el hilo (PspCreateThread) y el slot que almacena el puntero es global para todos los hilos con lo cual se inicializa (por la CRT) antes de llamar al main.

Cita de: "Austin Donnelly MSFT"
A quick browse of ...VCcrtsrctidtable.c shows that CRT (the C runtime library) keeps a per-thread data structure, pointed to from a TLS slot.

The per-thread data structure keeps thread-local copies of errno, pointers to some char buffers (eg for strerror(), asctime() etc), floating-point state and a smattering of other stuff.

This is dynamically allocated and initialised by _beginthread(), but obviously CreateThread can't do this since it knows nothing of the CRT. All CRT routines which access this per-thread data structure will lazily create it if it doesn't yet exist, however there's always the risk that this dynamic allocation may fail. This explains the comment "the CRT may terminate the process in low-memory conditions".

So if you don't plan on running out of memory (and who does!) then you can use either _beginthread() or CreateThread(). Do you feel lucky?

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.