MULTITHREADING C# CLASSE

 Tópico anterior Próximo tópico Novo tópico

MULTITHREADING C# CLASSE

C#

 Compartilhe  Compartilhe  Compartilhe
#452496 - 14/10/2015 08:24:16

TUNUSAT
SAMPA
Cadast. em:Dezembro/2003


Última edição em 05/09/2018 11:29:29 por TUNUSAT

PessoALL,

   Sem pressa...
   ... estou tentando passar de VB.Net para C#.Net o último código fonte que eu subi aqui:
===========================================================
MULTITHREADING VB.NET CLASSE
http://www.vbmania.com.br/index.php?modulo=detalhe&id=9448&pagina=1
===========================================================

   Para C#... mas estou com grávidos problemas... KKKKK!
   O "fresco" do C# (digo isso pq ele é cheio das "9 horas")... não tem a opção em:

   - Aba "Project" / Nome do Programa + "Properties..." / Na orelha "Application";
   - Container Panel (antigo Frame): "Windows application framework properties";
   - ComboBox "Shutdown mode:" / opções dentro da ComboBox:
          + When startup form closes (default);
          + When last form closes -> Precisa mudar para esta opção;

     Já o VB.Net tem essa opção tornando, como sempre, tudo mais fácil e sem nariz empinado de 'Case Sensitive' e outras maricagens tradicionais do C#...

     PERGUNTA:
     - Como configuro isso no braço?

    Eu achei isso, mas não funcionou no meu caso, veja se vocês entendem o que é preciso fazer:
=============================================================
How to Set Application Shutdown Mode in a C# Windows Forms Project?
http://stackoverflow.com/questions/8004036/how-to-set-application-shutdown-mode-in-a-c-sharp-windows-forms-project
=============================================================
shutdown mode in C#
https://social.msdn.microsoft.com/Forums/en-US/7f579c83-00c7-4d7d-a4bc-2ec19bbd4e74/shutdown-mode-in-c?forum=Vsexpressvcs
=============================================================
Propriedade Application.ShutdownMode
https://msdn.microsoft.com/pt-br/library/system.windows.application.shutdownmode(v=vs.110).aspx
=============================================================
Multithreading in C# .NET 4.5 (Part 1)
http://www.codeproject.com/Articles/1030252/Multithreading-in-Csharp-NET-Part
=============================================================
The Practical Guide to Multithreading - Part 2
http://www.codeproject.com/Articles/65158/The-Practical-Guide-to-Multithreading-Part
=============================================================
Multithreading Tutorial
http://www.codeproject.com/Articles/14746/Multithreading-Tutorial
=============================================================
Multithreading in .NET
http://www.codeproject.com/Articles/1132/Multithreading-in-NET
=============================================================

     Abaixo o código convertido:

=============================================================
clsThread.cs
=============================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MultiThreadC
{
    public  class clsThread
    {
        #region "Atributos"
        public long GenericGlobalCounter;
        public long TotalIncrements;
        public Int32 ContaClone;

        private String mClone;
        #endregion

        #region "Métodos"

        /// <summary>
        /// Constructor in C#.Net - Use "ctor" <TAB><TAB>
        /// </summary>
        /// <param name="numeros">Numbers of instances - Número de Instâncias</param>
        public clsThread(Int32 numeros)
        {
        // Initialize numbers of instances.
        // Inicializar um número de instâncias.
        }
        public clsThread()
        {
        // Initialize only one
        // Inicializar somente uma.
        }

        #endregion

        #region "Propriedades"

        public String pClone
        {
            get { return mClone; }
            set { mClone = value; }
        }

        #endregion
    }
}
=============================================================
frmThreadC.frm
=============================================================
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MultiThreadC
{
    /// <summary>
    /// OBSERVAÇÃO: NÃO TEM ISSO NO C#.Net, só no VB.Net!!!
    /// =====================================================
    /// Go to Properties - Vá em Properties (Alt+Enter)
    /// - Flap - Aba: Application / Option - Opção: ShutDown mode:
    /// - Change - Troque:
    ///            de:   "When startup form closes"
    ///            para: "When last form closes"
    /// =====================================================
    /// No C# precisa fazer isso:
    /// http://stackoverflow.com/questions/8004036/how-to-set-application-shutdown-mode-in-a-c-sharp-windows-forms-project
    /// How to Set Application Shutdown Mode in a C# Windows Forms Project?
    ///
    /// </summary>
    public partial class frmThreadC : Form
    {
        Int32 State;
        // State = 0 - Idle - Ocioso
        // State = 1 - Loading existing value - Carregando um valor existente
        // State = 2 - Adding 1 to existing value - Adicionando 1 a um valor existente
        // State = 3 - Storing existing value - Armazenando um valor existente
        // State = 4 - Extra delay - Atraso extra

        long Accumulator;
        const Byte OtherCodeDelay = 10;
        clsThread clsT = new clsThread();
        Random random = new Random();

        public frmThreadC()
        {
            InitializeComponent();
        }

        private void btnLaunch_Click(object sender, EventArgs e)
        {
            frmThreadC f = new frmThreadC();

            clsT.pClone = this.Text.Substring(0, this.Text.LastIndexOf(" ", this.Text.Length) + 1);
            clsT.ContaClone += 1;

            f.Top = Convert.ToInt32(f.Top - (2500 + random.Next() * 5000));
            f.Left = Convert.ToInt32(f.Left - (2500 + random.Next() * 5000));

            f.ShowIcon = false;
            f.ShowInTaskbar = false;

            //Application.Run(f);
            f.Show();
            //f.ShowDialog();
            

            if (clsT.pClone.Length <= 2)
            {
                //Original copy
                f.Text = "Cópia do Original: " + clsT.pClone + " - Clone: " + clsT.pClone + "." + clsT.ContaClone;
            }
            else
            {
                //Copy of clone
                f.Text = "Cópia do Clone: " + clsT.pClone + " - Clone: " + clsT.pClone + "." + clsT.ContaClone;
            }
        }

        private void frmThreadC_Load(object sender, EventArgs e)
        {
            this.Text = "Formulário Original: ";
            //The C# don't need the "Randomize"
            //O C# não precisa do "Randomize"
            tmrMultiThread.Interval = random.Next(750, 1500);
            //De acordo com a dica...
            //this.Hide();
            //frmThreadC mainForm = new frmThreadC();
            //mainForm.Show();

        }

        private void tmrMultiThread_Tick(object sender, EventArgs e)
        {
            Decimal otherdelay = 0;

            switch (State)
            {
                case 0:
                    lblOperation.Text = "Idle - Ocioso";
                    State = 1;
                    break;
                case 1:
                    lblOperation.Text = "Loading Acc - Carregando";
                    Accumulator = clsT.GenericGlobalCounter;
                    State = 2;
                    break;
                case 2:
                    lblOperation.Text = "Incrementing - Incrementando";
                    Accumulator += 1;
                    State = 3;
                    break;
                case 3:
                    lblOperation.Text = "Storing - Armazenando";
                    clsT.GenericGlobalCounter = Accumulator;
                    clsT.TotalIncrements += 1;
                    State = 4;
                    break;
                case 4:
                    lblOperation.Text = "Generic Code - Código Genérico";

                    if (otherdelay >= OtherCodeDelay)
                    {
                        State = 0;
                        otherdelay = 0;
                    }
                    else
                    {
                        otherdelay += 1;
                    }

                    break;
            }

            UpdateDisplay();
        }

        public void UpdateDisplay()
        {
            lblGlobalCounter.Text = clsT.GenericGlobalCounter.ToString();
            
            lblAccumulator.Text = Accumulator.ToString();
            
            lblVerification.Text = clsT.TotalIncrements.ToString();
        }

        private void frmThreadC_FormClosed(object sender, FormClosedEventArgs e)
        {
            Application.Exit();
            //Properties.Settings.Default.Save();
        }
    }
}
=============================================================

    Quem conseguir fazer pode subir aqui, mas me avisa que subiu para eu ver o código!

[]'s,
Tunusat.


Haja, pois, o que houver, ampliem-se obstáculos, agigantem-se problemas, intensifiquem-se lutas ou se agravem provações, trabalha sempre no bem de todos, porque, trabalhando na Seara do Bem, podes conservar a certeza de que Deus te sustentará. Emmanuel.

#452569 - 15/10/2015 02:09:28

JABA
CABO FRIO
Cadast. em:Agosto/2005


Última edição em 15/10/2015 02:16:40 por JABA

using System;
using System.Windows.Forms;

namespace Teste // não se esqueça de usar sua namespace
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MyContext());            
        }
    }

    public class MyContext : ApplicationContext
    {
        public MyContext()
        {
            Application.Idle += new EventHandler(Application_Idle);
            Form1 f1 = new Form1(); //coloque aqui o form de abertura
            f1.Show();
        }

        void Application_Idle(object sender, EventArgs e)
        {
            if (Application.OpenForms.Count == 0)
                Application.Exit();
        }

    }
}



_______________________________________________________________________________________________

Se a alma ou espírito são imateriais, como eles fazem para se localizarem quando o corpo está em movimento?



#452572 - 15/10/2015 08:12:29

TUNUSAT
SAMPA
Cadast. em:Dezembro/2003


Última edição em 15/10/2015 08:30:21 por TUNUSAT

JABA, o Justo,

   OKay, uma parte da profecia funcionou, veja o código... mas ainda não funciona...

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Threading.Tasks;
using System.Runtime.Remoting.Contexts;

namespace MultiThreadC
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            //Application.Run(new frmThreadC());
            Application.Run(new MyContext());
        }

        public class MyContext : ApplicationContext
        {
            public MyContext()
            {
                Application.Idle += new EventHandler(Application_Idle);
                frmThreadC f1 = new frmThreadC(); //coloque aqui o form de abertura
                f1.Show();
            }

            void Application_Idle(object sender, EventArgs e)
            {
                if (Application.OpenForms.Count == 0)
                    Application.Exit();
            }
        }
    }
}


    Mais ainda tem pelo menos dois problemas graves que notei.
    Por favor, rode o programa:
===========================================================
MULTITHREADING VB.NET CLASSE
http://www.vbmania.com.br/index.php?modulo=detalhe&id=9448&pagina=1
===========================================================

    * Perceba que:
    1 - Ao fechar um formulário no VB.Net (não importa se é o original ou uma cópia) os outros formulários trabalham "independentes" de qualquer outro.
    2 - Os formulários abertos NUNCA param de trabalhar ... seus contadores continuam incrementando.
    Não consigo fazer esse "efeito" (uma espécie de "Apartment-Model Threading in Visual Basic 6" - Veja em: https://msdn.microsoft.com/en-us/library/aa261361(v=vs.60).aspx) no C#.Net.

    Bom ... pelo visto o "MTA do VB6" é uma característica do velho objeto COM, veja em:
======================================================
C# - Single-Threaded Apartments vs Multi-Threaded Apartments [duplicate]
http://stackoverflow.com/questions/485086/single-threaded-apartments-vs-multi-threaded-apartments
======================================================

    E agora?

[]'s,
Tunusat.


Haja, pois, o que houver, ampliem-se obstáculos, agigantem-se problemas, intensifiquem-se lutas ou se agravem provações, trabalha sempre no bem de todos, porque, trabalhando na Seara do Bem, podes conservar a certeza de que Deus te sustentará. Emmanuel.

#452578 - 15/10/2015 11:11:04

OCELOT
SOROCABA
Cadast. em:Março/2012


Este exemplo multi threading do VB.Net não é multi threading, aquilo está mais para um exemplo de máquina de estados do que para multi threading

É fácil ver isso no exemplo em VB, como a lógica toda praticamente acontece dentro de tmrMultiThread_Tick, coloque dentro dele a linha

Debug.WriteLine(clsT.pClone & " Thread: " & Threading.Thread.CurrentThread.ManagedThreadId)

Então na janela Output do VS.Net vão começar a aparecer o número do "clone" seguido do ID da thread, este ID deveria ser único, um para cada thread do programa, mas ele sempre vai ser o mesmo para todos os forms.

Se quiser ainda pode fazer outro teste, se isso fosse multi thread, um thread não deveria interromper o outro, então adicione um novo botão e nele coloque o código

Threading.Thread.Sleep(10000)

Esta linha faz a thread atual dormir por 10 segundos, se você abrir vários forms e executar esta linha todos eles vão travar por 10 segundos, pois todos estão rodando na mesma thread.


Thread é algo complexo de se usar, e é difícil de se usar corretamente, pois é muito fácil causar problemas com o seu uso, na maioria dos casos quem está começando a aprender sobre threads acaba querendo usar elas onde não se deve.



#452587 - 15/10/2015 13:12:23

TUNUSAT
SAMPA
Cadast. em:Dezembro/2003


OCELOT,

   Obrigado, mudei rapidamente os nomes e depois dentro do código vou tentar ou fazer com thread ou pelo menos acertar os nomes retirando a palavra "thread".
   Foi muito bom você ter avisado, pois assim não estarei ensinado errado para outras pessoas.

[]'s,
Tunusat.


Haja, pois, o que houver, ampliem-se obstáculos, agigantem-se problemas, intensifiquem-se lutas ou se agravem provações, trabalha sempre no bem de todos, porque, trabalhando na Seara do Bem, podes conservar a certeza de que Deus te sustentará. Emmanuel.

#452588 - 15/10/2015 13:14:50

WEVERSON
GOIANIA
Cadast. em:Abril/2011


 Anexos estao visíveis somente para usuários registrados

Ola caro colega TUNUSAT,

Como vc pediu esta ai o seu programa refeito em c#.....

X-INFINITY
CONTATO: (062) 98484-4832 WHATSAPP.
www.xmastersoft.com.br


#452589 - 15/10/2015 13:29:29

TUNUSAT
SAMPA
Cadast. em:Dezembro/2003


Última edição em 15/10/2015 13:31:30 por TUNUSAT

WEVERSON,

   É isso ai!
   O único "problema" (entre aspas) é que se você fechar o formulário principal, todos os outros caem, mas até estava conversando com colegas de trabalho sobre isso (no VB.Net é fácil fazer isso não acontecer setando dentro do properties )
   Outro problema é o nome ... o Lancelot citou ... não usa várias "Threads"... então não é thread.

Vamos ler mais!
======================================================
Threading with Semaphore in C#
http://www.c-sharpcorner.com/UploadFile/1d42da/threading-with-semaphore-in-C-Sharp/
======================================================
Threading in C# - Part 2: Basic Synchronization
http://www.albahari.com/threading/part2.aspx
======================================================

[]'s,
Tunusat.

Haja, pois, o que houver, ampliem-se obstáculos, agigantem-se problemas, intensifiquem-se lutas ou se agravem provações, trabalha sempre no bem de todos, porque, trabalhando na Seara do Bem, podes conservar a certeza de que Deus te sustentará. Emmanuel.

#452590 - 15/10/2015 13:34:21

JABA
CABO FRIO
Cadast. em:Agosto/2005


TUNUSAT, o código que postei é apenas para a aplicação fechar quando o último form for fechado.

_______________________________________________________________________________________________

Se a alma ou espírito são imateriais, como eles fazem para se localizarem quando o corpo está em movimento?



#452591 - 15/10/2015 14:08:46

WEVERSON
GOIANIA
Cadast. em:Abril/2011


Última edição em 15/10/2015 14:09:30 por WEVERSON

TUNUSAT reaumento e o que o JABA fez em seu exemplo:

e só vc colar este código no Program.cs que eu te mandei que ele vai funcionar como o JABA disse...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace MultiThread
{
    static class Program {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main () {
            Application.EnableVisualStyles ();
            Application.SetCompatibleTextRenderingDefault (false);
            Application.Run(new MyContext());
        }

        public class MyContext : ApplicationContext
        {
            public MyContext()
            {
                Application.Idle += new EventHandler(Application_Idle);
                frmThread f1 = new frmThread(); //coloque aqui o form de abertura
                f1.Show();
            }

            void Application_Idle(object sender, EventArgs e)
            {
                if (Application.OpenForms.Count == 0)
                    Application.Exit();
            }
        }
    }
}


X-INFINITY
CONTATO: (062) 98484-4832 WHATSAPP.
www.xmastersoft.com.br


#452595 - 15/10/2015 15:19:46

TUNUSAT
SAMPA
Cadast. em:Dezembro/2003


WEVERSON e JABA,

   Obrigado, okay, entendi ... mas precisamos entender o que o OCELOT disse. Ele foi claro... NÃO É uma aplicação "Thread" ... então das duas a uma:
   1 - Ou mudo todos os nomes dos exemplos, por exemplo,  de "Thread" para "máquina de estados";
   2 - Ou acerto todos os exemplos para serem realmente Thread;

   Igual do desenho:
   "- Isso foi muito bonitinho... MAS TÁ ERRADO!"

   Pensei que "Thread" era mais "conceitual" que "programático" ... estava pensando ERRADO!
   Pesquisei um pouco mais sobre Thread e descobri que é parecido com "BeginTransaction" ... tipo ... você abre uma área de trabalho dentro do código (não entendi se gerenciável ou não gerenciável) para que o próprio código dispare o novo formulário em uma nova thread...

[]'s,
Tunusat.

Haja, pois, o que houver, ampliem-se obstáculos, agigantem-se problemas, intensifiquem-se lutas ou se agravem provações, trabalha sempre no bem de todos, porque, trabalhando na Seara do Bem, podes conservar a certeza de que Deus te sustentará. Emmanuel.

#452599 - 15/10/2015 16:01:31

JABA
CABO FRIO
Cadast. em:Agosto/2005


Tunusat, o funcionamento das threads é como colocar cada tarefa rodando concorrentemente em seus respectivos núcleos do processador, sem que se conheçam. É por isso que às vezes precisamos usar Delegates pra fazer essa ponte de uma thread para outra.

_______________________________________________________________________________________________

Se a alma ou espírito são imateriais, como eles fazem para se localizarem quando o corpo está em movimento?



 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por TUNUSAT em 05/09/2018 11:29:38