CiberSkull Posted March 12, 2006 at 02:25 AM Report #17889 Posted March 12, 2006 at 02:25 AM boas a todos, antes de mais é bom fazer parte dum forum tão completo 🙂 eu ando me a iniciar em c# e ando a tentar fazer um programa q aceite um texto apartir da consola, e apartir daí, escrever esse mesmo texto em dois ficheiros em simultaneo usnado, cm o assunto indica, threads. using System; using System.Threading; using System.IO; namespace Threaded { public class me { public static string texto; public static string path; public string Path { get { return path; } set { path = value; } } public string Texto { get { return texto; } set { texto = value; } } public me() { } public void copia() { Stream fix = new FileStream(path, FileMode.Create); for (int i=0 ; i < texto.Length ; i++) lock (this) { fix.WriteByte((byte) texto[i]); fix.Close(); Monitor.Pulse(this); if (i < texto.Length) Monitor.Wait(this); } } } class teste { public static void Main() { string text; me eu = new me(); me eu2 = new me(); text= Console.ReadLine(); eu.Path = "1.txt"; eu.Texto = text; eu2.Path = "2.txt"; eu2.Texto = text; Thread a = new Thread(new ThreadStart(eu.copia)); a.Start(); eu2.copia(); } } } o erro que me dá diz me q existem 2 processos a tentar aceder ao 2.txt, mas n tou a perceber cm é que isso acontece 🙂 já analizei o codigo + q uma vez mas n encontro o problema. Tenho alguma experiencia em trabalhar com fixeiros em C, mas infelizmente é a 1ª ves q trabalho com threads por isso pesso aos god's deste maravilhoso forum q me dêm a uma ajudinha 🙂 😄 brigadão desde já 🙂
theproject Posted March 14, 2006 at 12:13 AM Report #18177 Posted March 14, 2006 at 12:13 AM Boas, Não conheco C# mas pelo que sei de C++ e java, se o static tiver a mesma interpretação, significa que as variaveis public static string texto; public static string path; pelo facto de serem static são partilhadas por todas as instancias da classe, dessa forma, apesar de criares 2 objectos diferentes e dares valores diferentes a cada uma das vares dos mesmos, como são static é a mesma variável, logo o valor que fica lá é o da ultima atribuição, neste caso e tal 2.txt no Path. Peço desculpa se o static em C# não significa o que eu disse mas pelo que dizes indica-me que sim. Abraco[]
Chicomaravilha Posted March 14, 2006 at 12:32 AM Report #18181 Posted March 14, 2006 at 12:32 AM Peço desculpa se o static em C# não significa o que eu disse mas pelo que dizes indica-me que sim. Abraco[] Boa noite Efectivamente e tanto quanto sei em c# uma variável que seja static efectivamente é partilhada por todas as instancias dessa classe.
CiberSkull Posted March 14, 2006 at 06:02 PM Author Report #18240 Posted March 14, 2006 at 06:02 PM tens toda a razao 😄 ja tive a ler nuns forums e defenitivamente tens razao 😉, mas agora o problema é outro...agora julgo q seja de sincronizaçao...pk depois de escrever a 1a letra nos 2s fixeiros, o prog encrava...alguma sugestao? é que mt sinceramente n tou a ver cm resolver este prob... brigadao pelas respostas 😁
brink@ero Posted March 14, 2006 at 07:16 PM Report #18259 Posted March 14, 2006 at 07:16 PM Se tivesses esse problema em C++, tinha uma resposta com exemplo. Mas em C# não sei como se faz... Em C++ seria: Tens de criar um semáforo binário em que em cada thread poes: wait(semaforo) "acesso a zona crítica" sign(semaforo) Em que a zona crítica é o acesso a varíavel partilhada. Agora como se cria semáforos ou se existe outra maneira de resolver em C#... isso já não sei...
CiberSkull Posted March 14, 2006 at 07:45 PM Author Report #18272 Posted March 14, 2006 at 07:45 PM for (int i=0 ; i < texto.Length ; i++) lock (this) { fix.WriteByte((byte) texto[i]); fix.Close(); Monitor.Pulse(this); if (i < texto.Length) Monitor.Wait(this); } pois, mas tipuh, eu n estou a uzar o mesmo ficheiro nem nd, por isso é q n consigo perceber o meu erro 😉 o Monitor.Pulse e o Monitor.Wait devem equivaler a esse wait(semaforo) e sign(semaforo) just can't figure it out :\ anyway thak's pela resposta, mas + serão bem vindas 😄
theproject Posted March 15, 2006 at 01:45 AM Report #18375 Posted March 15, 2006 at 01:45 AM Bem, como disse nao sei C# e tenh alguma dificuldade em perceber o k se esta a pasar nesse codigo, de qualquer maneira, o problema k tentas resolver nao precisa de mecanismos de sincronizacao... nem trincos nem semaforos nem monitores, porque apesar de estares a usar 2 threads, ambas vao ler ao mesmo sitio e cada uma faz coisas diferentes com os dados ( neste caso, cada uma copia o que leu para um ficheiro diferente) ou seja, genericamente estamos a falar de um problema de multiplos leitores. Não precisas de sincro. Só precisas de sincronizacao se tiveres uma situação em que tens uma thread a tentar ler de um "sitio" onde outra está a escrever... percebes o k digo? Abraco[]
CiberSkull Posted March 15, 2006 at 06:56 PM Author Report #18436 Posted March 15, 2006 at 06:56 PM yaaa 😕 lol tens razao 😛 eu é q n pensei nisso 😛 tks 😄 td de bom []
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now