¿Porqué se traba después de 9000 lecturas y dibujos?

jorgempaz
28 de Noviembre del 2009
Muy atentamente agradeceré si alguien me puede indicar porqué el siguiente programa se traba después de leer y dibujar más de 9000 puntos. ¿Puede corregirse si se leen primero los puntos, se crea un malloc y luego se dibujan en series de 5000 en 5000?. Estoy usando Builder C++, creando una aplicación GUI, en windows XP sin SP2.

El archivo puntos.txt contiene las coordenadas de puntos y su respectivo color así:

coordx1
coordy1
color1
coordx2
coordy2
color2
...

Por ejemplo,

30
30
8
30
31
15
30
32
0
...

Dibuja puntos en la ventana de colores blanco y negro, dependiendo si el color es 0, 8 o 15.

#include <windows.h>
#include <stdlib.h>
#include <dir.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)
{
HWND hwnd;
MSG mensaje;
WNDCLASSEX wincl;
wincl.hInstance = hThisInstance;
wincl.lpszClassName = "MAPA_PUNTOS";
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof (WNDCLASSEX);
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = GetSysColorBrush(COLOR_BACKGROUND);
if(!RegisterClassEx(&wincl)) return 0;

// crea la ventana
hwnd = CreateWindowEx(
0,
"MAPA_PUNTOS",
"Mapa 1",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
1052,
675,
HWND_DESKTOP,
NULL,
hThisInstance,
NULL
);

// muestra la ventana
ShowWindow(hwnd, SW_SHOWDEFAULT);
while(TRUE == GetMessage(&mensaje, NULL, 0, 0))
{
// espera al usuario
TranslateMessage(&mensaje);
DispatchMessage(&mensaje);
}
return mensaje.wParam;
}

LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HDC hDC;
HPEN hPen1;
PAINTSTRUCT ps;
int i=0, j=0; char valor[5]; int salirYa=0;
char car[5]; int coord[3]; int cols=0;
FILE *in;
unsigned long numpunto=0;

switch (msg)
{
case WM_PAINT:
// abre el archivo
if ((in=fopen("puntos.txt","r"))==NULL)
{printf("No se puede abrir puntos.txt");
return; }
// inicia el dibujo
hDC =BeginPaint(hwnd, &ps);
while(salirYa==0)
{
// solo lleva la cuenta
numpunto++;
// captura los datos de 3 en 3
for(j=0;j<3;j++)
{
i=0;
char valor[5];
// lee un dato hasta el salto de renglón
do
{
valor[i]=getc(in);
if(valor[i]==EOF)
{salirYa=1;
break;}
}while(valor[i++]!=\'\n\');
if(salirYa==1)break;
valor[i-1]=\'\0\';
// convierte la cadena a valor numérico
coord[j]=atoi(valor);
}
if(salirYa==1)continue;
// elige el color
switch(coord[2])
{case 8: cols=0; break;
case 15: case 0: cols=255; break;
default: cols=255; break;
}
// crea la pluma con el color
hPen1 = CreatePen(PS_SOLID, 2, RGB(cols,cols,cols));
SelectObject(hDC, hPen1);
// dibuja circunferencias de radio 1
Ellipse(hDC, coord[0], coord[1], coord[0]+1, coord[1]+1);
}
// cierra y destruye objetos
fclose(in);
DeleteObject(hPen1);
EndPaint(hwnd, &ps);
printf("num: %u ",numpunto);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:return DefWindowProc(hwnd, msg, wParam, lParam);
}
}