Junio 26, 2007

SQLITE3 Seguimos

Implementación de sqlite3_progress_handler()

Bueno, acabo de terminar un nueva funcion, que creo que es bastante interesante,
sobre todo para los que programan con GUIs.

Dicha funcion es sqlite3_progress_handler()
¿ Y que hace dicha funcion que la hace tan especial ?
Pues una cosa que los amantes de los While les encantará , el poder hacer determinadas tareas cada X tiempo.

Imagina que realizamos un consulta del tipo "SELECT * FROM TEST", y que
contiene nada mas ni nada menos que 1 millon de registros.

A tu aplicacion no tardará en decir "I,m sorry, not respondo....", aunque realmente, si que esta trabajando, pero como no tiene manera de comunicarse con la GUIs para decirselo, pues... pasan estas cosas.

La solución es bien sencilla utilizando dicha función;

Sqlite3_Progress_Handler( db, Time, bCodeblock )

Donde
db
--> Db a usar

time
--> No es el tiempo propiamente dicho si no , es por cada N de opcodes de la
maquina virtual de Sqlite3. ( No preguntes que es, realmente no tengo ni
idea )

bCodeblock
--> Que es lo que queremos hacer, por ejemplo, hacer un SysRefresh() cada
cierto TIME.
Además, desde aqui, vamos a poder controlar si cancelamos o no la sentencia actual, permitiendo por ejemplo, cancelar la operacion de consulta.

Si devolvemos .F., continuará haciendo el trabajo.
Si devolvemos .T., cancelará lo que estaba haciendo.

Por ejemplo imagina este código;

#define TIME_CANCEL 4

static nSeconds

Function test()

nSeconds := Seconds()
Sqlite3_Progress_Handler( db, 50, {|| Cancel_Time() } )
for x := 1 to 100
sqlite3_exec( db, 'insert into test (nombre) values ( "pepe"
)',@cError )
next

function cancel_time()

if ( Seconds() - nSeconds >= TIME_CANCEL )
return .T.
endif
SysRefresh() // Dile a las Guis que espavilen..

return .F.

Con esto , cuando llegue el tiempo a 4 segundos, ya no va a permitir meter
más insert en la tabla.
( Esto por supuesto es un caso de experimentación, no tiene ningún sentido.)
Pero, bueno, ilustra como podemos cambiar, a traves de un boton por ejemplo,
el estado de la variable, para poder cancelar la operacion que se esta
llevando a cabo.

De todas maneras, el for continuaria, lo cual es incorrecto, porque estaria
no haciendo nada. Una version mejor seria;


#define SQLITE_INTERRUPT 9 /* Operation terminated by
sqlite3_interrupt()*/

for x := 1 to 100
nResult := sqlite3_exec( db, 'insert into test (nombre) values (
"pepe"
)',@cError )
if nResult = SQLITE_INTERRUPT
? "Se termino en " + Str( x, 3 )
EXIT
endif
next

En fin, espero que entendáis que es lo que se realiza y lo bien que nos puede ir
para hacer muchas cosas en los 'tiempos' muertos ;-)

Saludos
Rafa Carmona

Escrito por Rafa Carmona a las Junio 26, 2007 11:42 PM | TrackBack
Comentarios

网络营销软件
网络营销软件
网络营销软件
群发软件
群发软件
---
群发软件
博客群建软件
网络营销软件
论坛群发软件
网站排名软件
群发软件
推广小助手破解版
论坛群发
网站排名软件
群发软件
推荐给你很好的群发软件信息群发软件和供求群发软件
推荐给你很好的群发软件信息群发软件和供求群发软件博客群发软件网络营销软件网络营销软件
网站排名软件网站排名软件网站优化软件信息群发软件信息群发软件信息群发软件论坛群发软件网站推广软件网站推广软件博客群发软件博客群发软件
群发软件
网络营销软件
论坛群发
网站推广软件
群发软件群发软件博客群发软件论坛群发软件网络营销软件论坛群发软件
信息群发软件推广软件网站推广软件网络营销软件网站推广软件群发软件网站排名软件网站推广软件博客群发软件论坛群发软件群发软件网站排名软件网站推广软件博客群发软件论坛群发软件
网站排名软件
群发软件
博客群发软件
网站排名软件
网站推广软件
群发软件信息群发软件
免费论坛群发软件
论坛群发软件
网站排名软件
免费博客群发软件
网站推广软件

群发软件
博客群发软件
网站排名软件
网站推广软件
群发软件信息群发软件
免费论坛群发软件
论坛群发软件
网站排名软件
免费博客群发软件
博客群发软件
信息群发软件
论坛群发软件
信息群发软件
博客群发软件
qq群发软件
邮件群发软件
博客群建软件
企业名录搜索软件
信息群发软件
邮件群发软件
论坛群发软件
博客群发软件
网站推广软件
网络营销软件
全能营销破解版
网络营销软件
论坛群发软件
论坛群发软件
论坛群发软件
网络营销软件
信息群发软件
信息群发软件
信息群发软件
群发软件
论坛群发软件

Escrito por 群发软件 a las Febrero 10, 2008 01:25 PM
Escribir un comentario









¿Recordar informacion personal?