Publicidad:
La Coctelera

Programming Ape

Historias de un simio que programa

Categoría: Cosas que se programan

20 Septiembre 2005

Burbujas

Marco:

Después de toda una tarde peleando con la implementación de un algoritmo de ordenación de listas (bubble sort), con la única salvedad que es una lista de estructuras que tienen un puntero que apunta a la siguiente estructura, el sujeto se fue a casa sin haberlo conseguido implementar bien, había algo que al sujeto se le escapaba, sin embargo el algoritmo parecía estar bien (y tan bien que debía estar, ya que el sujeto estudió ese algoritmo en el primer año de carrera y en internet hay varios algoritmos de burbuja diferentes)

Al salir del despacho, el sujeto no dejó de darle vueltas al problema y en qué estaba metiendo la pata hasta que llegó al taller, donde el problema le pasó a un seguno plano cuando el mecánico le digo que el coche perdía líquido en el circuito estanco de la dirección asistida y que en un par de días tendría un recambio del tubo que su coche tenía dañado, mientras tanto rellenaba el líquido del circuito para que pueda ir tirando.

Una vez en casa y estando el sujeto en el sofá sin otra ocupación que buscar bolitas de roña en el ombligo le sobrevino una especie de conocimiento absoluto sobre los punteros y con éste el conocimiento del fallo tan ansiosamente buscado.

Raudo y veloz, cual murciélago indú que come cardillo y kiwi, el sujeto abre el portatil y en menos de 15 minutos tiene implementado en C una función que ordena el tipo de listas con las que está trabajando.

Conclusión:

El cerebro humano trabaja con un sistema operativo capaz de trabajar con threads y lograr una multitaréa real que ya la quisieran para sí los sistemas operativos actuales. No solo eso, sino que trabajando en modo subconsciente (o backgroud) trabaja mejor, porque las distracciones del estado consciente (o foreground) no parecen afectarlo en absoluto pudiendo centrarse únicamente en el problema dado, desempolvando conocimientos que el sujeto ya poseía, pero que por tener el foreground ocupado en muchas otras cosas no es capaz de encontrar.

Resultado:

 swapped = TRUE;

 while (swapped) {

  swapped = FALSE;

  for (cont = 0; cont < (max-1); cont++) {

   int idx;

   a = Lista;

   for (idx = 0; idx <= cont; idx++) {

    if (idx == 0) {

     ant = NULL;

     a = Lista;

    } else {

     ant = a;

     a = a->sig;

    }

   }

   b = a->sig;

   switch(campo) {

    case 1:

     strcpy(aval, a->company);

     strcpy(bval, b->company);

     break;

    case 2:

     strcpy(aval, a->period);

     strcpy(bval, b->period);

     break;

    default:

     strcpy(aval, a->db_name);

     strcpy(bval, b->db_name);

  }

  if (strcmp(aval, bval) > 0) {

   // se intercambian las posiciones

   swapped = TRUE;

   a->sig = b->sig;

   b->sig = a;

    if (ant == NULL) {

    Lista = b;

   } else {

    ant->sig = b;

   }

  }

 }

servido por guerrero 1 comentario compártelo

22 Agosto 2005

Malditos Threads (vitaminados)

Por fín, en "Programming Ape" cosas que tienen que ver con la parte "Programming" y no con la parte "Ape" del blog.

Desde que llegué de vuelta de vacaciones me he estado peleando con los hilos (threads) en VC++ 6.0. Era la primera vez que me topaba con la necesidad de ejecutar las cosas en un thread para que no me deje las ventanitas colgadas cuando algo tarda un poco. Es feo que una aplicación parezca colgada cuando solo está procesando los resultados de una query SQL.

La verdad es que la cosa es sencilla de cojones. Para crear un hilo sencillito que se ejecute en un diálogo que ya tiene su función de proceso de los datos que se le pasan solo se tienen que tener encuenta estas tres cosas:

1) La función CreateThread() para crear el thread.

2) La función TerminateThread() para matarlo cuando se salga antes de que el thread haya terminado (no se para cuando cierras el diálogo).

3) Una función desde la que se ejecute la función que ya se tiene hecha a la que se le pasan los parámetro que se ejecutan en la función vieja mediante una estructura pasada como void *.

Por ejemplo, una funcíon que inserte items en una lista y luego espere un segundo. Esto dejaría la ventana colgada si no se hace desde un thread:

la estructura que usaré:


struct argumentos {

char frasecita[256];

int num;

};

La funcíon para el thread:


DWORD WINAPI funcion_thread(LPVOID datos){

LVITEM fila;

int cont, acum;

struct argumentos *argums;

cont = 10;

argums = (struc arguentos *)datos;

for (acum = 0; acum < cont; acum++) {

char str[1024];

char *algo;

sprintf(str, "thread [%d - %d]", acum, argums->num);

memset((void *)&fila, 0, sizeof(fila));

fila.mask = LVIF_TEXT;

fila.iItem = acum;

fila.iSubItem = 0;

fila.pszText = str;

fila.cchTextMax = sizeof(fila.pszText);

SendDlgItemMessage(hDialogo, IDC_LIST, LVM_INSERTITEM,0,(LPARAM)&fila);

fila.iSubItem = 1;

fila.pszText = argums->frasecita;

fila.cchTextMax = sizeof(argums->frasecita);

SendDlgItemMessage(hDialogo, IDC_LIST, LVM_SETITEM,0,(LPARAM)&fila);

Sleep(1000);

}

return 0;

}

La llamada de thread:


struct argumentos *argums;

int id;

HANDLE hThread;

argums = (struct argumentos *)calloc(1, sizeof(struct argumentos));

strcpy(argums->frasecita, "soy una piedra");

argums->num = 12;

hThread = CreateThread(0, 0, funcion_thread, (LPVOID)argums, 0, &id);


Luego, a la hora de acabar a la fuerza con la función:


TerminateThread(hThread, 0);

Aunque la mejor opción es intentar terminar siempre el thread desde dentro con:


ExitThread(DWORD exitstatus);

Como se puede ver, la estructura de argumentos se le pasa como puntero y se recoge como tal, he intentado pasar la dirección de la estructura sin que ésta fuera un argumento, pero no me ha dejado la muy puta.

El mejor modo para saber si el Thread aún está corriendo o se ha quedado colgado o lo que sea es con la función:


BOOL GetExitCodeThread(HANDLE hThread, LPDWORD dwExitCode);

servido por guerrero sin comentarios compártelo


Sobre mí

Simio Programador

El gran hermano nos vigila:

Web site counter

Fotos

guerrero todavía no ha subido ninguna foto.

¡Anímale a hacerlo!

Buscar

suscríbete

Selecciona el agregador que utilices para suscribirte a este blog (también puedes obtener la URL de los feeds):

¿Qué es esto?

Crea tu blog gratis en La Coctelera