• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

CiberSkull

C# thread

8 mensagens neste tópico

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

            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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

td de bom []

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora