Delphi - suspender un Thread y Leer archivo txt

   
Vista:

suspender un Thread y Leer archivo txt

Publicado por Jairo (6 intervenciones) el 01/11/2009 05:35:41
Hola a todos,

Estoy haciendo una aplicación multiforms para generar reportes en Builder c++ 6.0 y necesito leer un archivo de texto cuando presiono un boton. El asunto es que tengo un Hilo (Thread) que se encarga de almacenar o escribir unos datos en un archivo txt, pero necesito acceder (leer) a estos datos y graficarlos cuando presiono un boton. He intentado suspender el hilo y tambien terminarlo, pero sigo sin poder leer archivo desde otro form de la misma aplicación. Al parecer el Hilo sigue teniendo acceso al archivo pues cuando trato de leer no me deja y me aparece error.
Cual sería el metodo o los pasos para poder leer el archivo que es manipulado por un Hilo desde un form a parte que se encuentra en la misma aplicacion?

Muchas Gracias a Todos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:suspender un Thread y Leer archivo txt

Publicado por E.T. (1106 intervenciones) el 02/11/2009 17:45:20
A parte de suspender el thread, necesitas cerrar el enlace al archivo, o tambien puedes intentar otra forma de acceso al archivo, como creas o abres el archivo desde el thread?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:suspender un Thread y Leer archivo txt

Publicado por Jairo (6 intervenciones) el 02/11/2009 19:29:53
Así lo escribo desde el Thread:
void __fastcall MiHilo::Calcular()
if(FileExists(Form1->FileName_Save)){
Form1->sf = new TFileStream(Form1->FileName_Save,fmOpenWrite);
}else{
Form1->sf = new TFileStream(Form1->FileName_Save,fmCreate);
}
Form1->sf->Seek(0,soFromEnd);//Localización de puntero al final del archivo
snprintf(str, 10, "%07.3f", SPO2);
Form1->sf->Write(str,strlen(str));//Escritura en archivo
Form1->sf->Write(";",1);//Escritura en archivo

delete(Form1->sf);//Liberación de memoria
delete(str);//Liberación de memoria
}
}
/****************************************************/
Y así lo leo desde un form diferente:
/****************************************************/

void __fastcall TForm4::Button1Click(TObject *Sender)
{
Form1->PHilo->Suspend();//Suspenda el Hilo
delete(Form1->sf);//Asegurar de que se liberó memoria
delete(Form1->PHilo->str);//Asegurar de que se liberó memoria

if(Form1->PHilo->Suspended){//Suspenda el Hilo
int tam=0;
char tempuno[2]=";";
char *ptr;
float *vector;
float flotante;
AnsiString hola;
char strr[10];
char *buffer;

if(FileExists(Form1->FileName_Open)){

of = new TFileStream(Form1->FileName_Open,fmOpenRead);
tam=of->Seek(0,soFromEnd);//puntero al final del archivo
if(tam>0){
buffer= new char [tam+1];//crea un buffer con el tamaño de archivo más el NULO
of->Seek(0,soFromBeginning);//Ubica el puntero al inicio del archivo
of->ReadBuffer(buffer,tam);//Lee todos los caracteres
buffer[tam]='\0';//Adiciono el caracter nulo para establecer un final para el puntero
ptr = strtok( buffer, tempuno );// Primera llamada => Primer token
this->Memo1->Lines->Add(ptr);//Mostrar en el memo2

while( (ptr = strtok( NULL, tempuno )) != NULL ){ // Posteriores llamadas
this->Memo1->Lines->Add(ptr); //Adiciona la cadena a una linea del Memo
}

vector=new float [this->Memo1->Lines->Count];//Cree un vector del tamaño del Memo
for(int i=0;i<this->Memo1->Lines->Count;i++){

hola=this->Memo1->Lines->operator [](i); //Tome cada valor del Memo y almacenelo en una variable temporal tipo AnsiString
vector[i]=atof(hola.c_str());//Conversion de String a flotante
this->Chart1->Series[0]->AddY(vector[i]);
}

delete [] buffer;
//delete (strr);
delete(ptr);
}
delete(of);
delete[] vector;
}

}


Muchas gracias, espero me puedan ayudar
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:suspender un Thread y Leer archivo txt

Publicado por E.T. (1106 intervenciones) el 02/11/2009 19:49:09
No tengo mucho conocimiento de c, pero en cual linea es la que te marca error?

Puede que este metodo: TFileStream, cree un handle al archivo creado, hay metodos para crear los archivos sin necesidad de handle, y de forma directa al archivo, sin pasar por el stream
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:suspender un Thread y Leer archivo txt

Publicado por Jairo (6 intervenciones) el 02/11/2009 20:37:38
En esta:
if(FileExists(Form1->FileName_Open)){
of = new TFileStream(Form1->FileName_Open,fmOpenRead);

Yo creo que cuando presiono un boton( el que da la orden de leer en el archivo) en mi programa, el puntero que escribe en el archivo aún se encuentra ejecutandose, por lo tanto creo que debo eliminarlo para que se cierre todo nexo con el archivo y así poder leerlo.
Que opinas?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:suspender un Thread y Leer archivo txt

Publicado por E.T. (1106 intervenciones) el 02/11/2009 20:56:30
En efecto, lo que sucede es que el TFileStream crea un handle al archivo, el cual queda abierto, haciendo pruebas en delphi, hay un metodo que libera al archivo

sf.Free;//Para delphi

para C no se como sería el llamadao al metodo Free

Form1->sf->Free; //Es así??
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:suspender un Thread y Leer archivo txt

Publicado por Jairo (6 intervenciones) el 02/11/2009 21:16:22
es así:
free(Form1->sf);

Esto ya lo había intentado antes, pero mira lo que dice la ayuda de borland:
Description

Do not call the Free method of an object. Instead, use the delete keyword, which invokes Free to destroy an object. Free automatically calls the destructor if the object reference is not NULL.

Yo utilizo eso en todo el programa. Que será lo que pasa?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:suspender un Thread y Leer archivo txt

Publicado por E.T. (1106 intervenciones) el 02/11/2009 23:24:03
Bien, el free aun así debería funcionar, prueba a destruirlo, no se si tengas el metodo destroy, tambien puedes probar esto:

Form1->sf = new TFileStream(Form1->FileName_Save, fmShareDenyNone);
con esa linea se abre el archivo pero otro proceso tambien lo puede accesar

El problema es al crear el archivo, tendrias que crearlo, cerrarlo, y abrirlo como arriba

void __fastcall MiHilo::Calcular()
if(!FileExists(Form1->FileName_Save)){
Form1->sf = new TFileStream(Form1->FileName_Save,fmCreate);
delete(Form1->sf);//Liberación de memoria
}
Form1->sf = new TFileStream(Form1->FileName_Save,fmShareDenyNone);
Form1->sf->Seek(0,soFromEnd);//Localización de puntero al final del archivo
snprintf(str, 10, "%07.3f", SPO2);
Form1->sf->Write(str,strlen(str));//Escritura en archivo
Form1->sf->Write(";",1);//Escritura en archivo

delete(Form1->sf);//Liberación de memoria
delete(str);//Liberación de memoria
}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:suspender un Thread y Leer archivo txt

Publicado por Jairo (6 intervenciones) el 03/11/2009 00:01:57
No se puede esto?:

Form1->sf = new TFileStream(Form1->FileName_Save,fmOpenWrite | fmShareDenyNone);

Alguien me lo recomendó. La linea que acabé de escribir no es la misma que me recomendaste?

Que pasa si ademas del fmShareDenyNone eliminino el puntero sf despues de suspender el thread y despues leo?
asi:

Form1->PHilo->Suspend();//Suspenda el Hilo
delete(Form1->sf);//Liberación de memoria
delete(Form1->PHilo->str);//Liberación de memoria

if(Form1->PHilo->Suspended){// Hilo suspendido???

if(FileExists(Form1->FileName_Open)){

of = new TFileStream(Form1->FileName_Open,fmOpenRead);
tam=of->Seek(0,soFromEnd);//puntero al final del archivo
if(tam>0){
buffer= new char [tam+1];//crea un buffer con el tamaño de archivo más el NULO
of->Seek(0,soFromBeginning);//Ubica el puntero al inicio del archivo
of->ReadBuffer(buffer,tam);//Lee todos los caracteres
buffer[tam]='\0';//Adiciono el caracter nulo para establecer un final para el puntero
ptr = strtok( buffer, tempuno );// Primera llamada => Primer token
this->Memo1->Lines->Add(ptr);//Mostrar en el memo2

while( (ptr = strtok( NULL, tempuno )) != NULL ){ // Posteriores llamadas
this->Memo1->Lines->Add(ptr); //Adiciona la cadena a una linea del Memo
}

vector=new float [this->Memo1->Lines->Count];//Cree un vector del tamaño del Memo
for(int i=0;i<this->Memo1->Lines->Count;i++){

hola=this->Memo1->Lines->operator [](i); //Tome cada valor del Memo y almacenelo en una variable temporal tipo AnsiString
vector[i]=atof(hola.c_str());//Conversion de String a flotante
this->QRChart1->Chart->Series[0]->AddY(vector[i]);
}

delete [] buffer;
//delete (strr);
delete(ptr);
}
delete(of);
delete[] vector;
}

}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:suspender un Thread y Leer archivo txt

Publicado por E.T. (1106 intervenciones) el 03/11/2009 00:27:47
No queda mas que probarlo.
No sabia que te dejara poner parámetros combinados, pero si te deja adelante
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:suspender un Thread y Leer archivo txt

Publicado por Jairo (6 intervenciones) el 04/11/2009 06:19:27
Ok, funcionó!!!

El asunto era combinar los parametros de lectura y escritura con fmShareDenyNone.
Muchas gracias por tu colaboración

Saludos cordiales.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar