MULTITHREADING C# CLASSE

TUNUSAT 14/10/2015 08:24:16
#452496
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.
JABA 15/10/2015 02:09:28
#452569
using System;
using System.Windows.Forms;

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

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

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

}
}

TUNUSAT 15/10/2015 08:12:29
#452572
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(); [txt-color=#e80000]//coloque aqui o form de abertura
[/txt-color] 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.
OCELOT 15/10/2015 11:11:04
#452578
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.
TUNUSAT 15/10/2015 13:12:23
#452587
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.
WEVERSON 15/10/2015 13:14:50
#452588
Ola caro colega TUNUSAT,

Como vc pediu esta ai o seu programa refeito em c#.....
TUNUSAT 15/10/2015 13:29:29
#452589
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.
JABA 15/10/2015 13:34:21
#452590
TUNUSAT, o código que postei é apenas para a aplicação fechar quando o último form for fechado.
WEVERSON 15/10/2015 14:08:46
#452591
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();
}
}
}
}
TUNUSAT 15/10/2015 15:19:46
#452595
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.
JABA 15/10/2015 16:01:31
#452599
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.
Página 1 de 2 [13 registro(s)]
Tópico encerrado , respostas não são mais permitidas