Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-01-2008
aprendiz2 aprendiz2 is offline
Miembro
 
Registrado: dic 2006
Posts: 70
Poder: 18
aprendiz2 Va por buen camino
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.. ?
Responder Con Cita
  #2  
Antiguo 27-01-2008
JXJ JXJ is offline
Miembro
 
Registrado: abr 2005
Posts: 2.475
Poder: 22
JXJ Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 27-01-2008
aprendiz2 aprendiz2 is offline
Miembro
 
Registrado: dic 2006
Posts: 70
Poder: 18
aprendiz2 Va por buen camino
Cita:
Empezado por JXJ Ver Mensaje
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 !!!!

Última edición por aprendiz2 fecha: 27-01-2008 a las 19:35:34.
Responder Con Cita
  #4  
Antiguo 28-01-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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 .

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

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 28-01-2008
aprendiz2 aprendiz2 is offline
Miembro
 
Registrado: dic 2006
Posts: 70
Poder: 18
aprendiz2 Va por buen camino
Volviendo al tema...

Cita:
Empezado por Lepe Ver Mensaje
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 .

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 !
Responder Con Cita
  #6  
Antiguo 28-01-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Concurso: averigua quién escribió el poema dec Humor 6 23-09-2005 00:23:25
...notas sobre la disputa de "Quien escribió Linux"... Jure Noticias 7 22-05-2004 19:05:22


La franja horaria es GMT +2. Ahora son las 23:51:43.


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
Copyright 1996-2007 Club Delphi