![]() |
| [R2] Essaie de Task | |
| trigram | 17-Feb-2011/17:51:17+1:00 |
| Voici un première ébauche de mon task : %obj.r
REBOL [
title: "OBJ"
file: %obj.r
]
make-obj: func [
"Créé un objet en sauvant son nom dedans."
'name "Nom de l'objet à créer."
obj "Objet de base à instancier."
spec "extension de l'objet de base."
] [
set name make obj append reduce [to-set-word 'obj-name to-string name] spec
]
save-obj: func [
"Sauvegarde un objet selon son propre nom."
'obj "Objet à sauvegarder."
/dir directory
/local name file
] [
name: any [all [word? obj object? get obj get in get obj 'obj-name] join "objet" random 10000]
file: copy ""
if dir [file: join directory file]
file: to-file rejoin [file name ".r"]
make-dir/deep to-file directory
save file get obj
]
load-obj: func [
"Recharge un objet et l'intanci selon son propre nom s'il en a un."
file "Nom du fichier à charger."
/bindto "Spécifier le contexte où binder la liste de l'objet chargé."
ctx "Nom de l'objet (contexte) ou binder la liste de l'objet chargé."
/local obj
] [
if exists? file [
obj: do load file
if all [in obj 'obj-name set to-word get in obj 'obj-name obj] [
if all [bindto object! ctx] [bind obj/list ctx]
]
]
obj
]
%task.r
REBOL [
title: "TASK"
file: %task.r
]
do %obj.r
debug: true
task: make object! [
obj-name: copy ""
task-dir: "task/"
list: copy []
add: funct [
"Ajoute à la liste."
t [block!] "Elément ou code à ajouter la liste."
/bindto "Spécifier le contexte où binder la liste de l'objet créé."
ctx "Nom de l'objet (contexte) ou binder la liste de l'objet créé."
] [
append list t
if all [bindto object! ctx] [bind list ctx]
list
]
save: does [
save-obj/dir self task-dir
]
run: has [task-file [file!]] [
task-file: to-file rejoin [task-dir obj-name ".tsk"]
attempt [delete task-file]
do list
write task-file "OK"
]
launch: does [
save
call/show join form to-local-file system/options/boot [" %launch-task.r " obj-name]
]
finished: does [
exists? to-file rejoin [task-dir obj-name ".tsk"]
]
]
load-task: funct [task-name [string!]] [
load-obj to-file rejoin ["task/" task-name ".r"]
]
%launch-task.r REBOL [ title: "LAUNCH-TASK" file: %launch-task.r ] do %task.r if value? 'debug [if debug [print rejoin ["Launch task = " system/script/args]]] launch-task: load-task system/script/args launch-task/run if value? 'debug [if debug [ask "Task terminated !"]] %demo-task.r REBOL [ title: "DEMO-TASK" file: %demo-task.r ] do %task.r make-obj task1 task [] task1/add [c: 0 c: c + 68] task1/add [print c] task1/add [wait 00:00:05] task1/add [print "1 finished !"] make-obj task2 task [] task2/add [a: 0 a: a + 28] task2/add [print a] task1/launch task2/launch print "Waiting for tasks to finish..." t1: t2: false while [not (t1 and t2)] [ if not t1 [t1: task1/finished if t1 [print "Task 1 is finished"]] if not t2 [t2: task2/finished if t2 [print "Task 2 is finished"]] ] print "All Task are finished !" halt C'est sûrement maladroit, mais cela me permettra de simuler du multi-tâche de manière simple. Notamment, pour le téléchargement des éléments d'une page Web en parallèle. Nico | |
|
Login required to Post. | |