Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Garantizar que se escribio (https://www.clubdelphi.com/foros/showthread.php?t=52649)

aprendiz2 27-01-2008 02:55:27

Garantizar que se escribio
 
Deseo encontrar alguna forma de "escribir" al disco duro y garantizar que se haga inmediatamente ( que no quede en los buffers de Win.. ).

( "Deshabilitar escritura en segundo plano" , no funciona. Pareciera que ese checkbox no tiene nada en el "OnClick" )

Lo unico que he encontrado que funciona, es el API flushfilebuffers( handle ), pero se vuelve leeeeentiiiiiisiiiiiimooooooo. ( se graba mas rapido en la disketera ).

Utilizar el FILE_FLAG_NO_BUFFERING con el CreateFile, esta en chino para mi, ya que pone muchos requisitos...

y el FILE_FLAG_WRITE_THROUGH no hace nada especial ... segun las pruebas que hice.

Estoy asombrado... lo lento que es Win.. al ejecutar el flushfilebuffers..., algo malo ha de haber en esa rutina... No es posible que un disco duro de 7200-RPM tarde mas en responder que una disketera !.

( Computadoras de hace 20 años atras, con NOVELL, en red, y procesadores 8088-2, de 8 Mhz grababan 10 veces mas rapido que Win.. con procesadores de 2 Ghz ! en el disco duro de la misma PC ( sin red ) ).

alguna sugerencia para "grabar inmediatamente", y que sea agil en Win.. ?

JXJ 27-01-2008 06:01:11

archivo guardar como..

no entiendo tu pregunta. con delphi..
puedes abrir y guardar informaicon al disco duro y verificar
que se escribio.
puedes basarte en un editor de texto.

aprendiz2 27-01-2008 17:59:57

Cita:

Empezado por JXJ (Mensaje 261302)
archivo guardar como..

no entiendo tu pregunta. con delphi..
puedes abrir y guardar informaicon al disco duro y verificar
que se escribio.
puedes basarte en un editor de texto.


A veces, lo que ves en el editor al comprobar, no necesariamente se esta leyendo del disco duro, se puede estar leyendo de los mismos buffers de Windows.

Para comprobarlo, haga los siguiente.

1 - Grabar algo.
2 - Desconectar el cable de la corriente.
3 - Conectar el cable de la corriente, arrancar la PC, intentar leer lo que se "grabo".

Si lo que grabaste aun esta ahi, problablemente el programa que grabo utilizo FlushFileBuffers despues de grabar. Si no esta ahi, entonces no lo utilizo.

Para aquellos que viven en paises donde la electricidad no falla, nunca veran la necesidad de "grabar inmediatamente".

En paises donde falla la electricidad, es sumamamente importante brincarse o vaciar inmediatamente los buffers. De otra manera, los archivos pueden quedar realmente destrozados.

Cuando se trata de "transacciones" de empresa, perder archivos completos no es aceptable.

Me diras que un UPS resuelve la situacion, pero te dire que no.

Los UPS funcionan excelente cuando el voltaje que alimenta el UPS desaparece.

Hay casos donde el voltaje que alimenta al UPS, "parpadea" rapidamente, en cuyo caso el UPS decide apagarse por auto-proteccion !!!. Se apaga hasta que todo se estabiliza.

Mientras tanto tu PC ya se apago y tus archivos quedaron literalmente destrozados ( los que tenian transacciones en los buffers de Windows ).


( He probado muchas marcas de UPS, todos hacen lo mismo ).
Inversores grandes tambien hacen los mismo ( con baterias de camion ).

Aqui donde vivo el caso es muy comun ( imagino en muchos otros paises "sub-desarrollados" tambien sucede lo mismo ). Varias veces al dia puden suceder "fenomenos" electricos, que causan que los UPS se apaguen ( parpadeos les llamo yo ).

El problema se resuelve forzando a Windows que grabe inmediatamente con
flushfilebuffers despues de cada transaccion. Ahi los archivos quedan en muy buen estado aun apagando la PC en medio de un proceso de escritura.

Mi queja viene de que Windows realiza el FlushFileBuffers con una lentitud extrema ( sin motivo, digo yo ), ya que grabar directamente a un diskette es mas rapido ( Windows no utiliza buffers al grabar al diskette ).

Ojala me haya explicado...


Si deseas comprobar la utilidad de flushFileBuffers al grabar, puedes hacer el siguiente experimento, muy sencillo:

Cita:

En un formulario,
- agregar un boton.
- agregar un TLabel
- agregar 2 checkboxes.
- cambiar el nombre de un checkbox a CheckBoxDetener.
- cambiar el nombre del otro checkbox a CheckBoxFlush.
- en el OnClick del boton escribir la siguiente rutina:
Código Delphi [-]
procedure TForm1.Button1Click( Sender : TObject );
  var  F : TFileStream;
        n : integer;
        S : string;
begin      
         {--- Crear un archivo ---}
 
       F := TFileStream.Create('C:\Prueba.txt', fmCreate );
       F.Free;  
 
          { Grabar "renglones", note que abrimos y cerramos  }
          { el archivo en cada vuelta del ciclo, lo cual daria   }
          { la impresion de que con cada vuelta, Win acutlizaria }
          { sus FAT y Directory entries, pero no lo hace, a menos }
          { que se haga flushFileBuffers despues de cada escritura }
 
       repeat
           F := TFileStream.Create( 'C:\Prueba.txt', fmOpenWrite + fmShareDenyNone );
          F.Position := F.Size ;   // ir al final del archivo
 
          S := 'Renglon ' + intToStr( i ) + #13 + #10; // lo que vamos a grabar
 
          F.WriteBuffer( S[1], length( S ) ); // grabamos lo que hay en S 
          
          if checkboxFlush.Checked then
               FlushFileBuffers( F.Handle );  //  API de Windows 
 
          F.Free;   // "cerrar" el archivo
 
 
            {   Mostrar contador en la pantalla    }
 
           inc( n );    label1.Caption := intToStr(n);  label1.Update;
 
           application.ProcessMessages;
      until CheckBoxDetener.Checked;
 
end;

Cita:

Si corres este programa, puedes ver el resultado con el NotePad o cualquier otro editor de texto. Simplemente abrir C:\Prueba.txt.

Tambien podras ver la diferencia en velocidad al utilizar el FlushFileBuffers.

Puedes probar desconectar la PC de la electricidad mientras esta escribiendo y veras la gran diferencia de lo que queda en el archivo. ( Si ! desconectar el cable de la corriente, mientras el ciclo esta ejecutandose. No tengas miedo... prueba !. )

Despues de hacer esto, verifica el resultado con cualquier editor de texto.

Ahora, imagina que ese archivo son facturas/recibos/ etc. que estan sucediendo una detras de la otra, desde varias PCs en red. Como quedarian los archivos despues de una falla de electricidad ?

Saludos !!!!

Lepe 28-01-2008 01:25:31

Quizás no se trate de marcas de UPS sino de calidad. El mío lo compré sabiendo que si un microcorte de luz es menor a 4 milisegundos, el UPS no sirve de nada.

Precisamente ayer he tenido uno de esos microcortes, suerte que no estaba trabajando, porque fastidia un poquito :D.

Desde hace 1 año que tengo el UPS, este es el primer corte que no lo aguanta.

Saludos

aprendiz2 28-01-2008 02:01:48

Volviendo al tema...
 
Cita:

Empezado por Lepe (Mensaje 261390)
Quizás no se trate de marcas de UPS sino de calidad. El mío lo compré sabiendo que si un microcorte de luz es menor a 4 milisegundos, el UPS no sirve de nada.

Precisamente ayer he tenido uno de esos microcortes, suerte que no estaba trabajando, porque fastidia un poquito :D.

Desde hace 1 año que tengo el UPS, este es el primer corte que no lo aguanta.

Saludos

Gracias Lepe !,

Me gustaria volver al tema principal:

Hay alguna alternativa al FlushFileBuffers de Win.. ? Algo que provoque la escritura inmediata, y que sea mucho mas agil ?

Gracias

Saludos !

ixMike 28-01-2008 02:43:56

Bueno, ¿y qué te parece estar llamando al método cada 2 minutos desde que se inicia Windows?

Aunque, ¿estás seguro de que eso es así? Porque acabo de hacer la prueba (la del Bloc de Notas/Se va la luz), y mis datos se habían guardado en el disco.

Utilizo WinXP Pro SP2, en una partición NTFS (lógico).

¿Cómo lo tienes tú? Igual el tipo de particion o la versión del sistema afecta.


Salu2.

Lepe 28-01-2008 14:21:08

¿Has probado a desactivar la caché de lectura/escritura para cada disco duro?

http://www.hispasonic.com/revista/8

A mitad de la página viene cómo desactivarla.

Saludos

aprendiz2 28-01-2008 19:38:22

Pregunta...
 
Cita:

Empezado por ixMike (Mensaje 261399)
Bueno, ¿y qué te parece estar llamando al método cada 2 minutos desde que se inicia Windows?

Aunque, ¿estás seguro de que eso es así? Porque acabo de hacer la prueba (la del Bloc de Notas/Se va la luz), y mis datos se habían guardado en el disco.

Utilizo WinXP Pro SP2, en una partición NTFS (lógico).

¿Cómo lo tienes tú? Igual el tipo de particion o la versión del sistema afecta.


Salu2.

Gracias ixMike !!!

Primero respondo a tus preguntas:
1 - Utilizo XP, SP2, NTFS .
2 - La idea de hacer un flush cada X tiempo, es excelente, pero no sabria como hacerlo, ya que el FlushFilebuffers pide de argumento el Handle de un archivo especifico. Y al "cerrar" el archivo, perderia el Handle. Tendria que mantener "abiertos" un monton de archivos hasta que llegue el momento del flush, y despues cerrarlos todos. Si hubiese una forma de decirle a Win.. que hiciera un "Flush" general, seria excelente. Pero no se como hacerlo.

Pregunta para usted:

1 - en la prueba que realizo. Como guardo los datos ? Con un editor ?
Si ese es el caso, probablemente el editor haga el flush cuando uno le dice "guardar". O sea, ya es parte del programa de ellos.

2 - Si usted corre el programa que puse ahi, creo que podra ver la diferencia entre usar el flush, y no usarlo.

Saludos !!! Gracias por interesarse en el tema.

aprendiz2 28-01-2008 20:06:30

Cache de escritura
 
Cita:

Empezado por Lepe (Mensaje 261474)
¿Has probado a desactivar la caché de lectura/escritura para cada disco duro?

http://www.hispasonic.com/revista/8

A mitad de la página viene cómo desactivarla.

Saludos


Lepe,
gracias por su interes en el tema !!

Efectivamente, probe esa opcion ya hace dias atras. ( Habilitar/quitar el cache de escritura )

Resultado: no es efectiva.

Es mas, no se nota ningun cambio en la PC. ( pareciera que el "Onclick" de ese checkbox que tiene Win ahí, no tiene nada asignado).

Pienso que sí hay algo mejor que el flushFileBuffers, ya que internamente Windows lleva muchisimos "logs" de eventos, mientras uno esta trabajando, y esos archivos aparentemente no se dañan y los mantienen actualizados a cada instante.

Si ellos (MSoft) utilizaran el flushfilebuffers, se notaria una degradacion tremenda en la PC. Algo diferente han de estar usando para "grabar inmediatamente". La pregunta es: Que ?
( a menos que guarden esos registros cuando la PC entra en Idle... ).

Pienso que el tema es muy importante, ya que un gran numero de aplicaciones estan relacionadas con "grabar" informacion. Garantizar que un "dato" quedo bien grabado ( o no grabado ) es primordial en cuaquier aplicacion que trate con datos de empresas. Perder archivos por fallas electricas no es aceptable ( es mi opinion ), ya que hay formas de "garantizar" la integridad de lo que se va grabando. Lo unico que debe quedar en duda, es la ultima transaccion realizada, donde se interrumpio el suministro. Lo anterior siempre deberia ser confiable. ( y sí es posible hacerlo así ). Eso da mucha solidez y confiabilidad a un programa.

Saludos, y otra vez muy agradecido por su interes en el tema.

aprendiz2 28-01-2008 20:17:33

Otro punto de vista
 
Deseo agregar otro punto de vista de un amigo...

Dice mi amigo que no vale la pena molestarse en "garantizar" la escritura de los datos. El principal motivo es el siguiente:

Las empresas que desarrollan software, tienen ingresos por la venta del software, asi como por dar "mantenimiento".

Muchas veces, el rubro de "mantenimiento" genera el 80% de los ingresos.

De donde viene el "mantenimiento" ? de algo que se "rompe".

Imagine un software que no genere mantenimiento...segun mi amigo, quiebra la empresa que hace el software.

Es como vender un "foco" que nunca se funde... o un auto que no se rompe.

Bueno, esta es la opinion de mi amigo. Yo difiero...

Saludos !

ixMike 28-01-2008 20:38:38

Cita:

Empezado por aprendiz2 (Mensaje 261620)
1 - en la prueba que realizo. Como guardo los datos ? Con un editor ?
Si ese es el caso, probablemente el editor haga el flush cuando uno le dice "guardar". O sea, ya es parte del programa de ellos.

Sinceramente, no lo entiendo. ¿Por qué tu programa al hacer el Flush se demora tanto, pero otros programas no lo hacen? No tiene mucho sentido.
¿Estás seguro de que necesitas hacer el Flush?

La prueba la hice con el Bloc de Notas, sí, pero viendo tu respuesta, la he hecho con un editor de texto improvisado, y con un fichero grande (de 10 MBs). El mismo resultado: mis datos están ahí.

No pienso repetir la prueba (esto de quitarle la alimentación al PC de repente no puede ser bueno, no es bueno).

¿O es que mi PC es maravillosa? ¿Será que tengo Ubuntu instalado en otra partición? :D ¿O quizás es porque coloco los zapatos debajo de la cama? Visto lo visto...

esto es muy extraño.


Espero que tu problema se solucione pronto.

P.D.: No he tocado ninguna configuración del registro en cuanto a caché y demás.

aprendiz2 29-01-2008 01:43:13

Una vez al final no se nota
 
Cita:

Sinceramente, no lo entiendo. ¿Por qué tu programa al hacer el Flush se demora tanto, pero otros programas no lo hacen? No tiene mucho sentido.

Hacer un flush al final de guardar mucha informacion, no se nota. Digamos que el flush consume 1/5 de un segundo. Eso pasa desapercibido.

Al meterlo en un ciclo, ahi es donde nos damos cuenta del tiempo real que consume.

Ahora, si queremos "copiar" o "generar" miles de registros, no es costeable hacer flush despues de cada registro. Habria que hacerlo despues del ultimo,
corriendo el riesgo de que el archivo quede despedazado si falla la electricidad en medio de esto.

Saludos !! Me despido por hoy

jachguate 29-01-2008 01:47:59

Cita:

Empezado por aprendiz2 (Mensaje 261728)
Eso pasa desapercibido.

Supongo que querés decir que pasa inadvertido, no veo la manera de que pase desapercibido... o quizás no entiendo lo que querés decir.. :confused:

aprendiz2 29-01-2008 01:54:11

Lo mismo
 
Cita:

Empezado por jachguate (Mensaje 261730)
Supongo que querés decir que pasa inadvertido, no veo la manera de que pase desapercibido... o quizás no entiendo lo que querés decir.. :confused:


Es lo mismo...
desapercibido: inadvertido, sin notarse, sin darnos cuenta, etc...


desapercibido:


sinónimos | definición RAE | conjugar verbos
en contexto | imágenes
en Inglés | en Francés | en Portugués
Diccionario de la lengua española © 2005 Espasa-Calpe S.A., Madrid:
desapercibido, da
  1. adj. Inadvertido, no percibido:
    sus palabras pasaron desapercibidas.

aprendiz2 29-01-2008 01:57:24

Ya se lo saben...?
 
Llegan dos hombres del campo a la gran ciudad, y van montados en un taxi, maravillados por todo lo que ven.

Uno le dice al otro:

Mira !, que bonita esa "estuata" !!

y el otro le responde...

Verdad que vos sos bruto... no se dice "estuata",
se dice "menumento !"


jaja

Bueno, lo pondre en la lista de chistes malos que vi por ahi en el foro...

egostar 29-01-2008 02:12:35

Cita:

Empezado por aprendiz2 (Mensaje 261737)
Llegan dos hombres del campo a la gran ciudad, y van montados en un taxi, maravillados por todo lo que ven.

Uno le dice al otro:

Mira !, que bonita esa "estuata" !!

y el otro le responde...

Verdad que vos sos bruto... no se dice "estuata",
se dice "menumento !"


jaja

Bueno, lo pondre en la lista de chistes malos que vi por ahi en el foro...

Creo que esto es una exageración y me parece mas que ofensiva, con el anterior post (Espasa-Calpe) era mas que suficiente para "demostrarnos" que no estabas equivocado, siento mucho que lo hayas puesto ya que en lo posterior alguien lo va a pensar para ayudarte (por lo menos Yo).

En fin, que te puedo decir, cada quien es responsable de sus actos.....

Salud OS

cHackAll 29-01-2008 02:23:15

Cita:

Empezado por egostar (Mensaje 261739)
Creo que esto es una exageración y me parece mas que ofensiva, con el anterior post (Espasa-Calpe) era mas que suficiente para "demostrarnos" que no estabas equivocado, siento mucho que lo hayas puesto ya que en lo posterior alguien lo va a pensar para ayudarte (por lo menos Yo).

En fin, que te puedo decir, cada quien es responsable de sus actos.....

Salud OS

Pues no esta tan mal amigo egostar; talvez nos sea de utilidad tener entre nosotros a un conocedor de los significados y la forma de escribir bien...

Saludos

aprendiz2 29-01-2008 03:31:19

no es mi intencion
 
Disculpe si alguien se molesto. No es mi intencion molestar ni ofender a nadie.

Saludos !

aprendiz2 29-01-2008 09:35:30

Voy caminando al exilio
 
Cita:

Empezado por egostar (Mensaje 261739)
puesto ya que en lo posterior alguien lo va a pensar para ayudarte.


Queria darles las gracias a todos, muy bello Club. Voy caminando al exilio, al pais de los "no ayudados jamas".

Pienso que seria bueno dar un aviso en la pagina principal acerca de la estructura del Club.

Por ejemplo, no sabia que EgoStar tenia funciones de Portavoz Publico en el Club, y quizas tambien desarrolla funciones de Alguacil, Depto. de Censura, Juez, Jurado y Depto. de Deportaciones, aunque realmente no me quedo clara la estructura que maneja internamente en su organizacion.

Un amigo me dice que la orden de exilio no es valida, ya que falta la palabra "CUMPLASE", al final del dictamen..., pero que sabe mi amigo de estas cosas.

Me despido con un abrazo a todos, son bellas personas.

Lepe 29-01-2008 09:51:53

Volviendo al tema, en mi caso, obtengo una pantalla:

http://img179.imageshack.us/img179/3052/canalidete5.jpg

Como ves, no es la simple casilla que viene en todos los windows de "deshabilitar cache de escritura", esta ventana es propia de mi hardware, quizás tú tengas algo similar.

Al modificar el writing cache, windows me pide reiniciar, y supongo que, si sirve de algo.

Esta ventana la obtengo de: administrador de dispositivos -> controladores IDE ATA/ATAPI ->propiedades de NVIDIA nForce4 parallel ATA Controler.

Si no tienes nada parecido, lo siento.

Saludos


La franja horaria es GMT +2. Ahora son las 05:12:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi