Jump to content
CiberSkull

C# thread

Recommended Posts

CiberSkull

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 :)   :D

brigadão desde já :)


I'm tired of all this nonsense about beauty being only skin-deep. That's deep enough. What do you want, an adorable pancreas? - Jean Kerr

Share this post


Link to post
Share on other sites
theproject

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[]

Share this post


Link to post
Share on other sites
Chicomaravilha

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.

Share this post


Link to post
Share on other sites
CiberSkull

tens toda a razao :D 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 :cheesygrin:


I'm tired of all this nonsense about beauty being only skin-deep. That's deep enough. What do you want, an adorable pancreas? - Jean Kerr

Share this post


Link to post
Share on other sites
brink@ero

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...

Share this post


Link to post
Share on other sites
CiberSkull

            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 :\ :wallbash:

anyway thak's pela resposta, mas + serão bem vindas :D


I'm tired of all this nonsense about beauty being only skin-deep. That's deep enough. What do you want, an adorable pancreas? - Jean Kerr

Share this post


Link to post
Share on other sites
theproject

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[]

Share this post


Link to post
Share on other sites
CiberSkull

yaaa :confused: lol tens razao :P eu é q n pensei nisso :P tks :D

td de bom []


I'm tired of all this nonsense about beauty being only skin-deep. That's deep enough. What do you want, an adorable pancreas? - Jean Kerr

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.