Delphi - Bug... ¿de Windows o de Delphi?

 
Vista:

Bug... ¿de Windows o de Delphi?

Publicado por Diego Romero (636 intervenciones) el 09/11/2002 21:55:05
Bien tengo es siguiente problema pero primero voy a poner la situación.
Hice un programa que va recolectando datos durante su ejecución (ingresados por el usuario) pero estos datos no se guardan definitivamente hasta que el usuario los confirme, como son muchos los datos y el riesgo de un cuelgue está siempre latente en Windows hice un algoritmo que cada cierto tiempo guarda cualquier cosa que el usuario haya ingresado hasta ese momento en un archivo temporal. SI al usuario se le ocurre cerrar el programa en medio de un ingreso le pregunto amablemente si desea guardar temporalmente los datos para que la próxima vez que inicie el mismo no tenga que empezar de cero. Esto funciona bién siempre y cuando NO SE REINICIE LA PC, si esto sucede y por más que el usuario haya guardado temporalmente cuando reinicia la PC y ejecuta nuevamente mi programa los datos temporales no están. ¿de quién es el bug?, ¿de Delphi o de Windows?.
Aclaración, no estoy usando ningún gestor de bases de datos (no BDE, no Access, no nada), solo archivos con formato propio.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Bug... ¿de Windows o de Delphi?

Publicado por VCH (1 intervención) el 10/11/2002 10:18:44
hola. a que llamas temporal?.
guardas los datos nada mas en memoria? si es asi es obvio que al reiniciar los datos no esten.
www.q3.nu/trucomania
ahi hay un codigo para escribir un archivo con un nombre de temporales y en el directorio de temp.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Bug... ¿de Windows o de Delphi?

Publicado por Diego Romero (636 intervenciones) el 10/11/2002 18:51:26
No, no en memoria, creo un archivo temporal en disco y no lo creo en la carpeta de temporales de Windows porque como es una carpeta de sistema cualquier otro programa en cualquier momento me los puede borrar, eso ya lo habia pensado desde el primer momento que se me ocurrió la idea, el archivo temporal está en el mismo directorio donde se instala mi programa.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Bug... ¿de Windows o de Delphi?

Publicado por Ernesto D'Spirito (706 intervenciones) el 10/11/2002 21:42:31
Windows usa un caché de escritura para realizar una doble optimización: 1) minimizar los accesos al disco; y 2) reordenar la secuencia de operaciones pendientes de lectura y escritura para minimizar el movimiento del brazo de las cabezas de lectura/grabación del disco (el componente mecánico más lento del mismo). En condiciones normales, entre que una aplicación graba y que los datos realmente llegan al disco pueden transcurrir dos segundos, pero en un sistema que está sobrecargado, la demora puede ser superior.

Creo que el caché de escritura de Windows puede ser desactivado marcando la casilla "Deshabilitar la caché de escritura en todas las unidades" que se encuentra en Panel de Control / Sistema / Rendimiento / Sistema de Archivos / Solución de Problemas.

Ahora bien, quitando el cache de escritura de Windows, cuando uno graba, ¿realmente graba? Generalmente no, porque muchas veces las funciones de lectura/escritura que proveen los lenguajes de programación usan sus propios cachés, por lo tanto debemos también forzar la escritura de los datos de este caché si queremos que la grabación efectivamente se realice. Para ello es necesario cerrar el archivo, o si pretendemos conservarlo abierto entonces tenemos que hacerle un "flush" (lo que puede hacerse con la API de Windows FlushFileBuffers, pasándole como parámetro el "handle" del archivo, que está en la propiedad Handle de un TFileStream si grabamos usando este objeto).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Bug... ¿de Windows o de Delphi?

Publicado por Diego Romero (636 intervenciones) el 11/11/2002 01:08:17
Ernesto siempre poniendome en la pista correcta, tanto en este foro como en su boletín de Latium :)
Efectivamente luego de aplicar FlushFileBuffers el problema aparentemente ha desaparecido, al menos en la PC de desarrollo, no fué necesario desactivar la caché de escritura a disco de Windows.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Bug... ¿de Windows o de Delphi? y una pregunta

Publicado por VCH (1 intervención) el 11/11/2002 01:35:33
8I
que raro, nunca me ha pasado eso de que se borre.
cuando yo he creado un temporal pues he utilizado GetTempFilename
luego creo un archivo utilizando el nombre que retorna y lo grabo.

bueno quizas algun dia me pase eso de que se borre y lo que dice Ernesto pues ta perfectus.

ahora cambiando el tema, y haciendo una pregunta.
alguien sabe como cambiar el icono de un exe ?
he utilizado estas apis pero se borra el contenido de los recursos completamente.
UpdateResource
EndUpdateResource

de seguro que me falta alguna otra api.

jandle:=BeginUpdateResource(pchar(\'E:\\destino.exe\'),true);

icono := TIcon.Create;
icono.handle := ExtractIcon(hInstance,\'e:\\origen.EXE\',0);
Image1.Picture.Bitmap.Width:= icono.Width;
Image1.Picture.Bitmap.Height:= icono.Height;
Image1.Picture.Bitmap.Canvas.Draw(0,0,icono);
image1.Picture.SaveToFile(\'E:\\asd.ico\');
j2:=loadicon(0,pchar(\'E:\\asd.ico\'));
UpdateResource(jandle,RT_icon,pchar(1),0,@j2,5);
EndUpdateResource(jandle,false);
icono.Free;

quizas esto este horrorosamente malo, alguien sabe por donde encontrar algo de info. :P.

saluos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Bug... ¿de Windows o de Delphi? y una pregunta

Publicado por Ernesto D'Spirito (706 intervenciones) el 14/11/2002 06:27:18
Se te borran los recursos del ejecutable porque eso le indicas en el segundo parámetro de BeginUpdateResource. Pásale False en vez de True para que no se borren los recursos existentes.

La llamada a UpdateResource me parece que también tiene problemas:

1) Si el recurso se llama "1", entonces el parámetro lpName debería ser PChar('1') o simplemente '1', no PChar(1).

2) El parámetro lpData no debe ser es un puntero al handle de un recurso que hayas cargado con LoadIcon, sino que debe apuntar a los datos en sí del recurso. Supongo que funcionaría cargar el contenido del archivo en memoria (puedes usar streams) y pasar el el puntero a esa memoria para el parámetro lpData. Lo que sí es seguro que funcione sería pasar el resultado de LockResource sobre un recurso cargado con LoadResource.

3) El último parámetro, cbData, indica el tamaño del recurso en memoria. Sería el valor devuelto por SizeofResource. Si funciona lo de cargar el archivo del icono en memoria, el valor sería lógicamente el tamaño del archivo.

Espero que mis comentarios te sirvan. La próxima vez, por favor crea una nueva Nota en el foro cuando presentas un tema nuevo.

Ernesto D'Spirito
http://www.latiumsoftware.com/es
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Bug... ¿de Windows o de Delphi? y una pregunta

Publicado por VCH (1 intervención) el 18/11/2002 19:25:52
:), gracias ernesto, bueno vamos a hechar a andar tus recomendaciones.
si y sobre eso : 1) Si el recurso se llama "1", entonces el parámetro lpName debería ser PChar('1') o simplemente '1', no PChar(1).

ahora he entendiodo bien el asunto, asi que primero enumero los recursos para obtener el nombre.

he leido el nro 36 de tu boletin y me ha matado muchas dudas.

bien gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar