Concurrencia en Archivos

Juan Diego Mart?
06 de Diciembre del 2003
Buenas.

Tengo un problemilla con archivos en Visual Basic. Estoy desarrollando una aplicación, que en cada paso que da, registra las operaciones en un fichero de log. A ésta aplicación se puede acceder desde diferentes equipos y al mismo tiempo, con lo cual el fichero debe estar 'accesible' desde diferentes puntos a un tiempo. El problema está, en como consigo esa concurrencia, debido a que en Visual Basic no tenemos una clase InputStream como en Java, o algo parecido, y siempre debemos abrir el archivo. Claro, cuando el segundo cliente accede a la aplicación, lo hecha porque no puede abrir un archivo que ya está abierto.

Alguien sabe de alguna solución?

Gracias de antemano.

Chema
06 de Diciembre del 2003
Prueba utilizar este algoritmo concurrente, esta en Pascal tienes que implementarlo en visual y poner en comun para los n procesos las variables del algoritmo para que todos puedan leer y actualizar estas variables

(* algoritmo de dijkstra para la exclusión mutua *)

const
nprocs=3;

var
b, c: array[0..nprocs] of boolean;
turno: integer;
i, nolineas : integer;


procedure lock(pnum: integer);
var
ok: boolean;
j: integer;

begin
b[pnum] := false;
repeat
while turno <> pnum do
begin
c[pnum] := true;
if b[turno] then
turno := pnum
end; (* while *)
c[pnum] := false;
ok := true;
for j := 1 to nprocs do
if j <> pnum then
ok := ok and c[j]
until ok
end; (* lock *)

procedure unlock(pnum: integer);
begin
c[pnum] := true;
b[pnum] := true;
turno := 0
end; (* unlock *)


process type terminal(n: integer);
var
loop: integer;

begin
for loop := 1 to 20 do
begin
lock(n);
nolineas := nolineas + 1;
unlock(n)
end
end; (* terminal *)

var
p: array[0..nprocs] of terminal;

begin
nolineas := 0;
for turno := 0 to nprocs do
begin
b[turno] := true;
c[turno] := true
end;
turno := 0;
cobegin
for i := 0 to nprocs do
p[i](i)
coend;
writeln('Total de Líneas: ',nolineas)
end.

lo unico que tienes que hacer es usar los procesos lock y unlock para entrar al recurso que quieres compartir

Rafa
06 de Diciembre del 2003
Hola.
Lo que planteas no creo que sea posible desde Visual Basic, y si lo es debe ser bastante engorroso de hacer.
Un solución que se me ocurre es que generes un .log en local para cada pc. Y despues crees otra pequeña aplicació que al final del dia lea cada uno de ellos y los guarde en uno solo.
Espero que lo puedas solucionar. Si consigues algún metodo para hacer lo que dices pasamelo por favor.

Baltasar
06 de Diciembre del 2003
Y si ese log lo guardas en una base de datos?
Está bien claro que de esa manera puede ser abierta desde varios sitios a la vez.
Yo es lo que uso en mis aplicacíones, y a modo de ejemplo diré que me gusta guardar cualquier detalle por tonto que parezca, como quien y cuando se creó tal cliente, quien y cuando se modificó, si fue borrado, y lo mismo para cualquier tabla de mis programas.
Saludos.