Ver Mensaje Individual
  #6 (permalink)  
Antiguo 26/04/2014, 09:22
menghi
 
Fecha de Ingreso: abril-2014
Ubicación: Málaga, Andalucía, España
Mensajes: 7
Antigüedad: 10 años, 6 meses
Puntos: 2
Respuesta: Necesito un código Escaner de Puertos en C++ usando Threads

Te pongo un ejemplo completo de como crear 3 threads que multipliquen un array de numeros por 3, 4 y 5 de forma asincrona.

He modificado un poco las clases que puse antes.

Se puede hacer mejor, pero es para que veas como funciona:

CThread.h
Código C++:
Ver original
  1. #include <Windows.h>
  2.  
  3. class CThread
  4. {
  5. private:
  6.     HANDLE hThread;
  7.     unsigned int thread_id;
  8.  
  9. public:
  10.     CThread();
  11.     ~CThread();
  12.  
  13.     int Start(unsigned int (__stdcall * func)(void *), void * params, bool suspended);
  14.     void Resume();
  15.     void Suspend();
  16.     HANDLE GetHandle();
  17. };

CThread.cpp
Código C++:
Ver original
  1. #include "CThread.h"
  2. #include <process.h>
  3.  
  4. CThread::CThread()
  5. {
  6.     this->hThread = NULL;
  7.     this->thread_id = 0;
  8. }
  9.  
  10. CThread::~CThread()
  11. {
  12.     CloseHandle(this->hThread);
  13.     this->thread_id = 0;
  14. }
  15.  
  16. int CThread::Start(unsigned int (__stdcall * func)(void *), void * params, bool suspended)
  17. {
  18.     if(this->hThread == NULL || this->thread_id == 0)
  19.     {
  20.         this->hThread = (void *) _beginthreadex(NULL, 0, func, params, 0, &this->thread_id);
  21.         if(suspended == false)
  22.             ResumeThread(this->hThread);
  23.         return 1;
  24.     }
  25.     return 0;
  26. }
  27.  
  28. void CThread::Resume()
  29. {
  30.     if(this->hThread)
  31.     {
  32.         ResumeThread(this->hThread);
  33.     }
  34. }
  35.  
  36. void CThread::Suspend()
  37. {
  38.     if(this->hThread)
  39.     {
  40.         SuspendThread(this->hThread);
  41.     }
  42. }
  43.  
  44. HANDLE CThread::GetHandle()
  45. {
  46.     return this->hThread;
  47. }

main.cpp
Código C++:
Ver original
  1. #include <Windows.h>
  2. #include <iostream>
  3. #include <string>
  4. #include "CThread.h"
  5.  
  6. using namespace std;
  7.  
  8. typedef struct{
  9.     string cadena;
  10.     int multiplicador;
  11. }datos;
  12.  
  13. int valores[16];
  14.  
  15. unsigned int WINAPI multiplica(void * params);
  16.  
  17. CThread hilo[3];
  18.  
  19. int main(int argc, char *argv[])
  20. {
  21.     //rellenamos el array valores para tener datos con los que trabajar:
  22.     for(int i=0;i<16;i++){ valores[i] = i; }
  23.  
  24.     //creamos tres hilos de ejecucion:
  25.     hilo[0] = CThread(); datos *dato1 = new datos; dato1->cadena = "Hilo 1"; dato1->multiplicador = 3;
  26.     hilo[0] = CThread(); datos *dato2 = new datos; dato2->cadena = "Hilo 2"; dato2->multiplicador = 4;
  27.     hilo[0] = CThread(); datos *dato3 = new datos; dato3->cadena = "Hilo 3"; dato3->multiplicador = 5;
  28.  
  29.     //ponemos a los tres hilos a trabajar
  30.    
  31.     hilo[0].Start(multiplica, dato1, false);
  32.     hilo[1].Start(multiplica, dato2, false);
  33.     hilo[2].Start(multiplica, dato3, false);
  34.  
  35.     WaitForSingleObject(hilo[0].GetHandle(), INFINITE);
  36.     WaitForSingleObject(hilo[1].GetHandle(), INFINITE);
  37.     WaitForSingleObject(hilo[2].GetHandle(), INFINITE);
  38.  
  39.     cout << "Fin" << endl;
  40.     cin.get();
  41. }
  42.  
  43. unsigned int WINAPI multiplica(void * params)
  44. {
  45.     int cursor = 0;
  46.     datos * dato = (datos *)params; //obtenemos el parametro;
  47.     while(cursor < 16)
  48.     {
  49.         int resultado = valores[cursor]*dato->multiplicador;
  50.         cout << dato->cadena << ": " << resultado << endl;
  51.         cursor++;
  52.         Sleep(1);
  53.     }
  54.     cout << dato->cadena << ": TERMINADO" << endl;
  55.     return 1;
  56. }

Al ejecutarlo devuelve algo como esto:

Código C++:
Ver original
  1. Hilo 1: Hilo 2: 0
  2. Hilo 2: 4
  3. 0
  4. Hilo 3: 0
  5. Hilo 2: 8
  6. Hilo 3: Hilo 2: 12
  7. 5
  8. Hilo 1: Hilo 2: 16
  9. Hilo 3: 10
  10. 3
  11. Hilo 2: 20
  12. Hilo 2: 24
  13. Hilo 3: 15
  14. Hilo 1: 6
  15. Hilo 2: 28
  16. Hilo 2: 32
  17. Hilo 3: 20
  18. Hilo 1: 9
  19. Hilo 2: 36
  20. Hilo 1Hilo 2: 40
  21. : 12
  22. Hilo 3Hilo 2: 44
  23. : 25
  24. Hilo 2: 48
  25. Hilo 1: 15
  26. Hilo 3: 30
  27. Hilo 1: 18
  28. Hilo 3: 35
  29. Hilo 1: 21
  30. Hilo 1: 24
  31. Hilo 2: 52
  32. Hilo 3: 40
  33. Hilo 2: 56
  34. Hilo 3: 45
  35. Hilo 2: 60
  36. Hilo 3: 50
  37. Hilo 2: TERMINADO
  38. Hilo 1: 27
  39. Hilo 3: 55
  40. Hilo 1: 30
  41. Hilo 3: 60
  42. Hilo 1: 33
  43. Hilo 3: 65
  44. Hilo 1: 36
  45. Hilo 3: 70
  46. Hilo 1: 39
  47. Hilo 3: 75
  48. Hilo 1: 42
  49. Hilo 3: TERMINADO
  50. Hilo 1: 45
  51. Hilo 1: TERMINADO
  52. Fin

Como ves al principio, las salidas por consola se mezclan un poco, esto es porque dentro del thread habrá que usar un mecanismo de mutex o semaforos, supongo.

Un saludo!!