• Domingo 6 de Julio de 2025, 14:56

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.


Mensajes - diego.martinez

Páginas: 1 2 [3] 4 5 ... 12
51
C/C++ / Re: Proceso siempre activo
« en: Miércoles 31 de Marzo de 2010, 14:43 »
Comprueba primero, como dice Eternal Idol, si realmente necesitas una ventana para simplemente contar. Si sigues necesitandola entonces:

Cita de: "Epa"
 
while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
 
        if (count(&ultimo))
        {
           SendMsg(chwnd, VK_F4);
        }
    }

GetMessage bloquea el proceso hasta que hay un mensaje en la ventana.

Mejor usa:
Cita de: "Epa"
 
while (1)
{
while (PeekMessage (&messages, NULL, 0, 0,PM_REMOVE))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
    if (count(&ultimo))
    {
          SendMsg(chwnd, VK_F4);
     }
    Sleep(1);
}

El PeekMessage retorna haya o no mensaje, y con el PM_REMOVE, emula el comportamiento del GetMessage.
Recuerda poner un Sleep(1) para evitar el consumo alto de cpu.

Otra cosa, para contar segundos, puedes usar la Api  :

SetTimer
KillTimer

http://msdn.microsoft.com/en-us/library/ms644906(VS.85).aspx


suerte!
 :hola:

52
C/C++ / Abrir puerto en NON-BLOCKING
« en: Miércoles 24 de Marzo de 2010, 20:32 »
buenas:

hasta la fecha he programado servidores que abrian un puerto y escuchaban en tcp, pero siempre los hice bloqueantes.
En UDP, sin embargo, tengo el servidor como no-bloqueante, y todo va bien.

Sin embargo, estoy teniendo problemas para abrir un puerto tcp en no-bloqueante.

No entiendo muy bien.
Si despues de preparar el socket, hacerlo nobloqueante, hacer el listen y luego el accept; cuando el accept me devuelve WSA_WOULDBLOCK, que debo hacer para aceptar la conexion? Incluso lo he puesto en un bucle para recibir, pero no consigo entrar en el socket.

Código: C++
  1.  
  2. int appTCP::Open()
  3. {
  4. //-------- preparo el socket
  5.   sockaddr_in service;
  6.   ZeroMemory(&service,sizeof(service));
  7.   service.sin_family = AF_INET;
  8.   service.sin_addr.s_addr = htonl(INADDR_ANY);
  9.   service.sin_port = htons(Port);
  10.  
  11.     //creamos un socket para TCP
  12.     this->Socket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  13.     if (this->Socket==SOCKET_ERROR) return 1;
  14.  
  15.     //limpiamos nuestra address para hacer de host
  16.     memset((void *)&Host, '', sizeof(struct sockaddr_in));
  17.    
  18. //tomo los datos del host
  19.     /* Set family and port */
  20.     Host.sin_family = AF_INET;
  21.     Host.sin_port = htons(Port);
  22.  
  23.     /* Get host name of this computer */
  24.         gethostname(host_name, sizeof(host_name));
  25.         HostProperties = gethostbyname(host_name); //cojemos el nombre de la maquina local
  26.  
  27.         /* Check for NULL pointer */
  28.         if (HostProperties == NULL)
  29.             return 1;
  30.  
  31.         /* Assign the address */
  32.         Host.sin_addr.S_un.S_un_b.s_b1 = HostProperties->h_addr_list[0][0];
  33.         Host.sin_addr.S_un.S_un_b.s_b2 = HostProperties->h_addr_list[0][1];
  34.         Host.sin_addr.S_un.S_un_b.s_b3 = HostProperties->h_addr_list[0][2];
  35.         Host.sin_addr.S_un.S_un_b.s_b4 = HostProperties->h_addr_list[0][3];
  36.  
  37.         /*tenemos la ip , hagamosla string*/
  38. sprintf(StringIP,"%d.%d.%d.%d",Host.sin_addr.S_un.S_un_b.s_b1,Host.sin_addr.S_un.S_un_b.s_b2,Host.sin_addr.S_un.S_un_b.s_b3,Host.sin_addr.S_un.S_un_b.s_b4);
  39.        
  40.         TimeOut.tv_usec = msTimeout%1000;
  41.         TimeOut.tv_sec = msTimeout/1000;  // Time in seconds
  42.  
  43.  
  44.         u_long iMode = 1;
  45.         ioctlsocket (Socket, FIONBIO, &iMode);
  46.         err=WSAGetLastError(); 
  47.  
  48.         FD_ZERO (&fdSocket);
  49.         FD_SET  (Socket, &fdSocket); //ponemos el socket en vigilancia
  50.  
  51.         bind(Socket,(struct sockaddr *)&Host,sizeof(sockaddr));
  52.  
  53.         listen(Socket,SOMAXCONN);
  54.         unsigned int i=0;
  55.         err=WSAGetLastError(); 
  56.        
  57.         sockaddr Incoming;
  58.         int size=sizeof(Incoming);
  59.        
  60.         do
  61.         {
  62.             err=0;
  63.             SOCKET r=accept(Socket,&Incoming,&size);
  64.             if (r==-1)
  65.             err=WSAGetLastError();
  66.  
  67.         }while (err==WSAEWOULDBLOCK);
  68.            
  69. return 0;
  70. }
  71.  
  72.  

53
C/C++ / Re: programar reloj de sol C++
« en: Martes 23 de Marzo de 2010, 18:44 »
depende de como quieras representarla.

Usando GDI de windows? Opengl? DirectX?

54
OpenGL / Re: Puntos OpenGL
« en: Martes 16 de Marzo de 2010, 19:58 »
seguramente se refiere a mostrar con texto las coordenadas de forma visible.
Lo mejor es que uses glPrint.. o algo asi

http://nehe.gamedev.net/data/lessons/le ... ?lesson=13

aqui tienes un tutorial , si lo que quieres es mostrar texto.

suerte!

55
C/C++ / Re: Problema con proyecto de arboles (Imprime direccioens de mem
« en: Miércoles 10 de Marzo de 2010, 19:58 »
wenas:

lo mas probable es que lo que le estes pasando a cout sea el PUNTERO al objeto y no el objeto en si.
Al usar el puntero estas usando una direccion de memoria y la unica operacion de salida que hace el sistema por defecto con punteros es mostrarlos.
Puedes invocar al operador de stream usando * delante del puntero, para solicitar el uso del contenido de la direccion de memoria.

ex:
Código: C++
  1.  
  2. cout << *mypunteroaclase;
  3.  
  4.  

seguramente sea eso.
Si con * no funciona, es por que tendras algun problema en la definicion de los operadores de stream.

56
C/C++ / Re: Excepcion Curiosa
« en: Viernes 26 de Febrero de 2010, 10:08 »
muchas gracias, era eso lo que me temia.

57
C/C++ / Excepcion Curiosa
« en: Jueves 25 de Febrero de 2010, 20:14 »
Buenas:

Llevo un par de dias con una excepción muy curiosa en mi codigo.

Código: Text
  1.  
  2. ...
  3. 'GRegister.exe': Loaded 'C:WINDOWS.0system32shlwapi.dll', No symbols loaded.
  4. 'GRegister.exe': Loaded 'C:WINDOWS.0system32msvcrt.dll', No symbols loaded.
  5. [color=#FF0000]First-chance exception at 0x7c92b21a in GRegister.exe: 0xC0000005: Access violation writing location 0x00000010.[/color]
  6. 'GRegister.exe': Unloaded 'C:Archivos de programaKaspersky LabKaspersky Anti-Virus 6.0 for Windows Workstationsadialhk.dll'
  7. 'GRegister.exe': Unloaded 'C:WINDOWS.0system32shlwapi.dll'
  8. 'GRegister.exe': Unloaded 'C:WINDOWS.0system32msvcrt.dll'
  9. ...
  10.  
  11.  

es una excepcion que se produce en la incialización de la aplicación , sin llegar a ejecutar ni una linea de codigo (o sea, que se produce durante la inicialización del programa, crt, windows, variables staticas...) .

Pero lo mas curioso, es que SOLO ocurre si en algun lugar uso MessageBox.
Si no hay ninguno, no ocurre, asi que es algo que se compila solo si se incluye esta funcion.

Igualmente, el codigo (a pesar de ser una excepcion de escritura en puntero no valido) funciona todo correctamente.
Quizas es el antivirus que esta supervisando los messagebox del sistema? os ha pasado algo asi a vosotros?


PD: me pasa con cualquier codigo, no solo con el GRegister, asi que no puede ser cosa de mi source. Quizas es algo de como esta montado el proyecto? quizas estoy mezclando alguna cosa?

gracias!

att:
Diego Martinez

58
C/C++ / Re: registro de windows
« en: Jueves 4 de Febrero de 2010, 16:58 »
pues, es un programa de vigilancia de un dispositivo de hardware. El programa lee continuamente el puerto tcp/ip o rs232 para mostrar eventos del dispositivo.
La cosa es que muchas veces se instala en ordenadores que estan administrados y capados por los de IT de la empresa y me dan algun susto.

El ultimo caso fue que el administrador no permitia la lectura del registro a los usuarios no admin, con lo que me han dejado sin configuración en esos usuarios.
Por lo que me dijeron, la instalación se hizo como admin, pero claro, si se hizo en HKEY_LOCAL_MACHINE/software/nombre_programa luego no podia acceder a los datos desde el usuario restringido. Normalmente no da problema, por que el admin suele autorizar la clave, pero queria encontrar la forma de no necesitar permisos especiales del admin para guardar/leer la configuración en el registro desde usuarios, aunque haya que instalar como admin.

Los datos guardados son datos de conexion generalmente (puerto com, ip destino) asi como variables propias del programa, los mismos para todos los usuarios. Especialmente, guarda las rutas de los archivos que usa para funcionar, ya que se inicia al arrancar el windows.  

gracias por la respuesta!

59
C/C++ / Re: red social en c++
« en: Jueves 4 de Febrero de 2010, 16:56 »
lo que te estan pidiendo es que relaciones personas con personas.
E incluido con otras consideraciones, como grupo al que pertenecen, red que representan (colegio, fans...), asi como otros conceptos multiples , como por ejemplo, fotos en las que salen.

Considera que para vincular de N a N , debes crear una tabla intermedia. Las tablas en su mayoria seran HASH (para hacer busquedas rapidas).
Cada persona tendra un vinculo de 1 a N amigos... etc...

yo creo que esto ya ha tenido que hacerte sonar campanas.

suerte!  :hola:


por cierto, que hay subforo de algoritmos y de estructuras de datos

60
C/C++ / Re: registro de windows
« en: Miércoles 3 de Febrero de 2010, 16:28 »
pero si cambian de usuario, no "desapareceria" ese registro?

61
C/C++ / registro de windows
« en: Miércoles 3 de Febrero de 2010, 12:28 »
Buenas:

tengo una aplicación que durante la instalación crea una clave en el registro de windows.
HKEY_LOCAL_MACHINESoftwarenombre_de_programa

El problema es que en algunos entornos en los que el usuario no tiene permisos para acceder a los registros, el programa se queda sin acceso.

Como puedo hacer para que el programa tenga permisos superiores sin conocer las claves de administrador?

att:
Diego Martinez

62
C/C++ / Re: invalid digit "8" in const octal
« en: Lunes 1 de Febrero de 2010, 09:37 »
es simple, quita el "0" que tienes delante de los numeros.

en c, cualquier numero que empieza con 0 se considera octal. Tu solo quieres ver el valor en decimal, asi que simplemente, quita el 0 de delante, igual que si quisieras verlo en hexadecimal pondrias 0x o en binario 0b, en octal se pone solo un 0 delante.
Código: C++
  1.  
  2. case 1:
  3. case 2:
  4. ...
  5. case 8:
  6. case 9:
  7.  
  8.  

63
C/C++ / Re: interfaz para std::map
« en: Martes 26 de Enero de 2010, 15:48 »
parece que a la hora de pasar templates hay algun problema con como lo definí.

deberia haber hecho:
Código: C++
  1.  
  2.   typedef typename map<_Kty,_Ty>::iterator iterator;
  3.  
  4.  

resuelto!

64
C/C++ / interfaz para std::map
« en: Martes 26 de Enero de 2010, 12:21 »
buenas:

estamos haciendo una interfaz para poder cambiar en un proyecto entre std::map o std::vector.

Para ello estamos haciendo un objeto que contendra a uno de estos, y dispondrá de todos los metodos del mapa, para que, una vez implementado , podamos alterar solo el interfaz sin que el proyecto sea afectado.

Esto va bien:

Código: C++
  1.  
  2.  
  3. template <class Key, class T, class Compare = less<Key>, class Allocator = allocator<pair<const Key,T> > >
  4. class CMAP
  5. {
  6. public:
  7.   map<Key,T,Compare,Allocator > Internal;
  8.  
  9.   unsigned int size() const
  10.   {
  11.     return Internal.size();
  12.   };
  13.  
  14.   T& operator[](const Key& k)
  15.   {
  16.   return Internal[k];
  17.   }
  18.  
  19.   void clear()
  20.   {
  21.   Internal.clear();
  22.   }
  23.    
  24. };
  25.  
  26.  
  27.  


Por ahora va bien, pero me esta dando un problema al intentar devolver un iterador.
Código: C++
  1.  
  2.   map<Key,T,Compare,Allocator >::iterator begin()
  3.   {
  4.      return Internal.begin();
  5.   }
  6.  
  7.  

el compilador me devuelve:
Error[Pe757]: nontype "map<_Kty, _Ty, _Pr, _Alloc>::iterator [with _Kty=Key, _Ty=T, _Pr=Compare, _Alloc=Allocator]" is not a type name


como puedo hacer para devolver iteradores con los tipos correctos?


gracias!!!

65
Visual C++ / Re: Mensaje de un hilo a otro
« en: Martes 26 de Enero de 2010, 10:12 »
Código: C++
  1.  
  2.  
  3. MSG Msg;
  4. while (PeekMessage(&Msg,NULL,0,0,PM_REMOVE)!=0)
  5.         {
  6.         TranslateMessage(&Msg);
  7.                 DispatchMessage(&Msg);      
  8.         }
  9.  
  10.  

tienes que recibir los mensajes de windows simplemente. Y poner ese identificador de mensaje en el Procedure del otro hilo.
Si no usas procedure, simplemente mira manualmente el mensaje en el propio message pump.

PD: tambien puedes usar otros mecanismos de comunicacion, en el foro deberia haber un post que pregunté yo al respecto.

66
C/C++ / Re: necesito hacer un hook al gdi32.dll
« en: Miércoles 20 de Enero de 2010, 10:58 »
renombra la original, haz una dll gdi32.dll con los procedimientos iguales que la original y que cuando los llamen, importe los de la dll original y los ejecute, y (antes/despues) añades tu proceso.

67
Servidores / forzar al explorer a usar MTDM en el ftp
« en: Jueves 14 de Enero de 2010, 13:55 »
buenas:

me encuentro con este problema.
Cuando uso el explorer para acceso a un ftp, me encuentro que todos los archivos que se guardan pierden la fecha.

Fijandome en los comandos, el explorer no intenta poner bien la fecha de los archivos usando el comando MTDM , alguien sabe como forzarle a usarlo?

68
C/C++ / Re: array de numeros reales
« en: Martes 12 de Enero de 2010, 09:56 »
el visual studio 8 xpress es gratis tambien

69
C/C++ / Re: Usar funciones GDI tras pulsar un comando
« en: Lunes 11 de Enero de 2010, 13:25 »
pues en el WM_COMMAND, si se dan las condiciones, puedes llamar a :

UpdateWindow

o

RedrawWindow

son sutilmente diferentes miratelas en msdn.

Deberias mirar tambien InvalidateRect...  


PD:
a ese switch le faltan cases...

EI: juntando mensajes.

Cita de: "maxstepin"
WM_COMMAND como puedo hacer que envie un mensaje WM_PAINT y que identifique el comando pulsado?
te vendran en los lparam y wparam.

70
C/C++ / Re: array de numeros reales
« en: Lunes 11 de Enero de 2010, 12:57 »
te da algun fallo al compilar?

yo lo que veo es que recibes los valores en un  scanf ("%i"... eso es para cargar enteros. Deberias usar scanf("%f ...

si el fallo es solo que no entran bien los valores quizas solo sea eso.

71
C/C++ / Re: directorio desde el que se arranco el ejecutable
« en: Lunes 11 de Enero de 2010, 09:42 »
si es para windows usa

_getcwd

72
C/C++ / Re: perdida del Icono del System Tray al reiniciar el explorer
« en: Martes 15 de Diciembre de 2009, 16:24 »
encontre la solución:

cuando se reinicia el explorer envia un broadcast "TaskbarCreated" a todas las ventanas del tray, asi que puedo capturarlo para reiniciar el tray:

en el codigo de la ventana que recibe los mensajes del icono
Código: C++
  1.  
  2. static UINT s_uTaskbarRestart;
  3.  
  4.         switch(m)
  5.         {
  6.               case WM_CREATE:
  7.                      s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
  8.                      return 0;
  9.  
  10.               default:
  11.                      if(m == s_uTaskbarRestart)
  12.                      {                      
  13.                          ((w32Tray*)T)->Data.cbSize=0;
  14.                          T->Update();
  15.                      }
  16.                      else
  17.                      {
  18.                          HWND ag=FindWindowEx(0,0,"myWindow","mywindow");
  19.                          if (ag!=NULL)
  20.                              SendMessage(ag,m,wp,lp);
  21.  
  22.                      }
  23.             break;
  24.         }
  25.  
  26.  

73
C/C++ / Re: Cambio de base
« en: Martes 15 de Diciembre de 2009, 16:20 »
para ver el resultado de una division puedes usar

para ver el  valor floor(dividendo / divisor)
para ver el resto dividento%divisor

a medida que extraigas los restos ve metiendolos por la derecha o bien en un array o bien multiplicando por el valor de representación.

74
C/C++ / perdida del Icono del System Tray al reiniciar el explorer
« en: Lunes 14 de Diciembre de 2009, 18:26 »
Buenas:

Nuevamente, el fantasma del shellnotifyicon me persigue.

En este caso el problema que tengo es que si se reinicia el explorer.exe del windows pierdo el icono de la aplicación.

Alguien sabe como puedo:

detectar el reinicio del explorer para volverlo a poner / hacer que el icono sobreviva al explorer?

gracias

75
C/C++ / Re: Serie matemática...
« en: Lunes 14 de Diciembre de 2009, 18:10 »
el += es un  operador de c que significa "S es igual al valor de S + el valor a la derecha del ="

S+=2 -> S= S + 2;

por lo demas, yo haria la funcion de calculo con una funcion recursiva.

Páginas: 1 2 [3] 4 5 ... 12