none
Multithreads en C, no me deja recibir datos del teclado RRS feed

  • Pregunta

  • Buenas noches, estoy comenzando un proyecto personal dividido en varios archivos fuente para mayor organización, también me decidí a usar varias funciones independientes y me topé con los threads, casi todos son bien complicados de entender y hace poco encontré la sentencia _beginthread definida en process.h y me sale de pelos, xq puedo poner en marcha mi reloj e imprimir cosas en pantalla, pero ahora viene el problema, y es que cuando trato de pedir un usuario y una contraseña al usuario, ps si entra a la función pero no me deja escribir y no sé xq :( adjunto el código del reloj, el baner (disculpen pero lo hice muy rústico :D), el main, y el header:

    #ifndef LIBCRYPT_H
    #define LIBCRYPT_H
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <process.h>
    #include <time.h>
    #include <windows.h>
    #include <dir.h>
    #include <conio.h>
    
    int menu();
    void reloj();
    void first_time();
    void banner();
    
    #endif
    
    


    El main:

    #include "libcrypt.h"
    
    int main( )
    {  
      FILE *archivo;  
      int noBDD=0;
      SetConsoleTitle(" Crypter-Text 2 by thEpisode Productions.");
      MessageBox(NULL,"Crypter-Text 2 es una aplicación puramente en consola, \npor lo tanto para introducir algún dato, tiene que ser \npor medio del teclado.\n\n\t  thEpisode Productions","Atención",MB_SETFOREGROUND | MB_OK | MB_ICONASTERISK | MB_ICONINFORMATION);
      keybd_event(VK_SHIFT,0x9e,0 , 0); 
      keybd_event(VK_SHIFT,0x8f, KEYEVENTF_KEYUP,0);  
      _beginthread((void(*)(void*))banner, 0, 0); 
      _beginthread((void(*)(void*))reloj, 0, NULL); 
      if(archivo!=fopen("BDD\\User.dat","r"))
      {
       _beginthread((void(*)(void*))first_time, 0, NULL); 
      }  
      system("pause");
      return EXIT_SUCCESS; 
    }
    
    


    El banner:

    #include "libcrypt.h"
    
    void banner(void)
    {
     unsigned char a1=186,a2=200,a3=205,a4=188;
     HANDLE hStdin, hStdout; 
     COORD coord; 
     DWORD result; 
     hStdin = GetStdHandle (STD_INPUT_HANDLE);
     hStdout = GetStdHandle (STD_OUTPUT_HANDLE);
     while(!(GetAsyncKeyState(VK_UP) && GetAsyncKeyState(VK_RIGHT)))
     {
     coord.X = 25; 
     coord.Y = 0;
     SetConsoleCursorPosition (hStdout, coord);                    
     SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY | FOREGROUND_GREEN);    
     printf("%c   CRYPTER-TEXT 2   %c",a1,a1);
     coord.X = 25; 
     coord.Y = 1;
     SetConsoleCursorPosition (hStdout, coord);
     printf("%c      by      %c",a1,a1);
     coord.X = 25; 
     coord.Y = 2;
     SetConsoleCursorPosition (hStdout, coord);
     printf("%c thEpisode Productions %c",a1,a1);
     coord.X = 25; 
     coord.Y = 3;
     SetConsoleCursorPosition (hStdout, coord);
     printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n\n",a2,a3,a3,a3,a3,a3,a3,a3,a3,a3,a3,a3,a3,a3,a3,a3,a3,a3,a3,a3,a3,a3,a3,a3,a3,a3,a4);
     {
     coord.X = 79; 
     coord.Y = 1;
     SetConsoleCursorPosition (hStdout, coord);
     SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY | FOREGROUND_RED );
     printf("t");
     coord.X = 79; 
     coord.Y = 2;
     SetConsoleCursorPosition (hStdout, coord);
     SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY | FOREGROUND_RED  );
     printf("h");
     coord.X = 79; 
     coord.Y = 3;
     SetConsoleCursorPosition (hStdout, coord);
     SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY | FOREGROUND_RED  );
     printf("E");
     coord.X = 79; 
     coord.Y = 4;
     SetConsoleCursorPosition (hStdout, coord);
     SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY | FOREGROUND_RED  );
     printf("p");
     coord.X = 79; 
     coord.Y = 5;
     SetConsoleCursorPosition (hStdout, coord);
     SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY | FOREGROUND_RED  );
     printf("i");
     coord.X = 79; 
     coord.Y = 6;
     SetConsoleCursorPosition (hStdout, coord);
     SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY | FOREGROUND_RED );
     printf("s");
     coord.X = 79; 
     coord.Y = 7;
     SetConsoleCursorPosition (hStdout, coord);
     SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY | FOREGROUND_RED  );
     printf("o");
     coord.X = 79; 
     coord.Y = 8;
     SetConsoleCursorPosition (hStdout, coord);
     SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY | FOREGROUND_RED );
     printf("d");
     coord.X = 79; 
     coord.Y = 9;
     SetConsoleCursorPosition (hStdout, coord);
     SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY | FOREGROUND_RED );
     printf("e");
     coord.X = 79; 
     coord.Y = 11;
     SetConsoleCursorPosition (hStdout, coord);
     SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY | FOREGROUND_RED );
     printf("P");
     coord.X = 79; 
     coord.Y = 12;
     SetConsoleCursorPosition (hStdout, coord);
     SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY | FOREGROUND_RED );
     printf("r");
     coord.X = 79; 
     coord.Y = 13;
     SetConsoleCursorPosition (hStdout, coord);
     SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY | FOREGROUND_RED );
     printf("o");
     coord.X = 79; 
     coord.Y = 14;
     SetConsoleCursorPosition (hStdout, coord);
     SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY | FOREGROUND_RED );
     printf("d");
     coord.X = 79; 
     coord.Y = 15;
     SetConsoleCursorPosition (hStdout, coord);
     SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY | FOREGROUND_RED );
     printf("u");
     coord.X = 79; 
     coord.Y = 16;
     SetConsoleCursorPosition (hStdout, coord);
     SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY | FOREGROUND_RED );
     printf("c");
     coord.X = 79; 
     coord.Y = 17;
     SetConsoleCursorPosition (hStdout, coord);
     SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY | FOREGROUND_RED );
     printf("t");
     coord.X = 79; 
     coord.Y = 18;
     SetConsoleCursorPosition (hStdout, coord);
     SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY | FOREGROUND_RED );
     printf("i");
     coord.X = 79; 
     coord.Y = 19;
     SetConsoleCursorPosition (hStdout, coord);
     SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY | FOREGROUND_RED );
     printf("o");
     coord.X = 79; 
     coord.Y = 20;
     SetConsoleCursorPosition (hStdout, coord);
     SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY | FOREGROUND_RED );
     printf("n");
     coord.X = 79; 
     coord.Y = 21;
     SetConsoleCursorPosition (hStdout, coord);
     SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY | FOREGROUND_RED );
     printf("s");
     } 
     Sleep(1000);
     fflush(stdin);
     fflush(stdout);
     /*coord.X = 0; 
     coord.Y = 5;
     SetConsoleCursorPosition (hStdout, coord);
     SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY);*/
     }
     _endthread(); 
    }
    
    

    El reloj: 

    #include "libcrypt.h"
    
    void reloj()
    {
     time_t tiempo,tiempo2; 
     char output[128];
     struct tm *tlocal;  
     HANDLE hStdin, hStdout; 
     COORD coord; 
     DWORD result; 
     hStdin = GetStdHandle (STD_INPUT_HANDLE);
     hStdout = GetStdHandle (STD_OUTPUT_HANDLE);
     while(!(GetAsyncKeyState(VK_UP) && GetAsyncKeyState(VK_RIGHT)))
      { 
       coord.X = 53; 
       coord.Y = 0;
       SetConsoleCursorPosition (hStdout, coord); 
       SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY | FOREGROUND_INTENSITY ); 
       tiempo= time(0);
       tlocal = localtime(&tiempo);
       strftime(output,128,"%H:%M:%S",tlocal);
       tiempo2= time(0);
       if(tiempo!=tiempo2)  
       {  
        tiempo = time(0); 
        printf("%s\n",output);
       }
       else
       {
        printf("%s\n",output);
       }
       Sleep(999);
      }
      _endthread(); 
    }
    
    

    El first_time donde pido el usuario y contraseña: 

    #include "libcrypt.h"
    
    struct Users
    {
     char log[MAX_PATH+1];
     char password[20];
    }User_crypt;
    
    void first_time()
    {
     FILE *archivo;
     HANDLE hStdin, hStdout; 
     COORD coord; 
     DWORD result; 
     hStdin = GetStdHandle (STD_INPUT_HANDLE);
     hStdout = GetStdHandle (STD_OUTPUT_HANDLE);
     int i=0,counter=260,bandera=1;
     char c=0,a1=164,a2=8,a3=32;
     coord.X = 0; 
     coord.Y = 5;
     SetConsoleCursorPosition (hStdout, coord); 
     SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY);
     fflush(stdin);
     fflush(stdout); 
     if(!_access("BDD\\",0))
     printf("El directorio existe\n");
     else
     {
     if(!mkdir("BDD\\"))  
      {
      printf("Directorio creado.\n");  
      printf("\n Usuario nuevo: ");
      do
      {
       fflush(stdin);
       fflush(stdout);
       c=getche();
       User_crypt.log[i]=c;
       i++;   
       //printf("\n%d",counter);
       counter--;
      }while(!GetAsyncKeyState(VK_RETURN));
      fflush(stdin);
      fflush(stdout);
      i=0;
      printf("\n Contrase%ca: ",a1);  
      do
      {
       fflush(stdin);
       fflush(stdout);
       if((c=getche()) && c!=a2)
       {
       printf("%c*",a2);
       if(c==a2)
        printf(".");
       }
       User_crypt.password[i]=c;
       i++;   
      }while(!GetAsyncKeyState(VK_RETURN));
      //if(archivo=fopen("BDD\\User"))
      printf("\n");
      }
      else
      {
      printf("El directorio de bases de datos no se puede crear, favor revisar permisos y reiniciar programa.\n");
      }
      
     }
     _endthread(); 
    }
    
    
    Muchas gracias al que me colabore, es que le estoy mirando por todo lados y no encuentro la solución :/

    miércoles, 29 de junio de 2011 3:39

Todas las respuestas

  • No he mirado todo el código, pero me da la impresión (tampoco lo sé seguro) de que la entrada de teclado sólo está disponible en el hilo principal dentro de una ventana de comandos...
    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    miércoles, 6 de julio de 2011 11:43
    Moderador
  • Gracias por tu respuesta, ps si mi programa es todo en consola, y para cada subprograma o función le hice un thread, e estado intentando con los diferentes tipos de threads (semaforos, mutex y otros) y llegué casi a lo mismo, _beginthreadex ..... y ya almenos no se me desorganiza la información, pero sigo sin poder entrar datos :/ 

     

    Gracias! :D

    viernes, 8 de julio de 2011 3:13
  • Bueno, acabo de revisar el código y ya sé por qué no te funciona: GetAsyncKeyState() sólo funciona para aplicaciones windows con bucle de mensajes, no para aplicaciones de consola.

    La idea que se me ocurre es que en el main, hagas un cin en bucle, y pones la tecla pulsada en una variable global.

    Luego puedes o bien enviarle un mensaje a cada thread dependiendo de qué hayan pulsado o que cada thread lea dicha variable global y actue en consecuencia.

    Otra cosa: dentro de los bucles de los threads tienes que poner algún tipo de sleep o la cpu se te subirá al 100% de proceso...


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    viernes, 8 de julio de 2011 9:38
    Moderador
  • Wow muchas gracias haré las modificaciones respectivas y luego comento :D gracias!
    jueves, 14 de julio de 2011 20:10