domingo, 11 de abril de 2021

Comunicação Síncrona e Assíncrona

 Comunicação síncrona refere-se ao contato imediato entre o emissor (quem envia a mensagem) e o receptor (quem recebe a mensagem), a comunicação assíncrona é atemporal. 

Na comunicação assíncrona o emissor envia a mensagem, mas não necessariamente o receptor irá recebê-la imediatamente.

Imaginemos que um emissor está a enviar uma mensagem de texto através de um tubo e que a mensagem é enviada recorrendo a bolas, cada bola com uma letra. Quando as bolas chegam ao receptor, a mensagem tem que ser remontada, ou seja, têm que se colocar as bolas pela ordem correta, para se voltar a ter a mensagem.

  • Em comunicação Assíncrona, cada bola tem um número de sequência, que permite que seja colocada na sua posição. Isto permite que as bolas sejam enviadas e recebidas por qualquer ordem, uma vez que esse número de sequência identifica a posição de cada bola (letra) na mensagem.
  • Em comunicação síncrona, as bolas têm que ser enviadas e recebidas de forma sincronizada, mantendo uma ordem bem definida: a primeira bola (letra) a ser enviada, tem que ser a primeira a ser recebida e assim sucessivamente.


Comunicação Síncrona

Em uma comunicação síncrona o emissor e receptor são sincronizados pelo mesmo relógio, o receptor recebe de modo contínuo (mesmo quando nenhum bit é transmitido) os dados em compasso em que o emissor as remete.

inserir a descrição da imagem aqui

Simples exemplo em Javascript:

function foo(){
    console.log("foo");
}
function bar(){
    console.log("bar");
}
function baz(){
    console.log("baz");
}
foo();
bar();
baz();

Essas funções serão executadas em ordem, bar não será executada até que foo tenha terminado e baz por sua vez só será executado após o término de bar, havendo assim uma sincronia.

Comunicação Assíncrona

Em uma comunicação assíncrona a sincronização é diferente, o emissor envia o fluxo de dados e periodicamente insere um elemento de sinal, comumente chamado de flag, para que seja possível distinguir aonde começa (a informação de início da transmissão é o start-bit) e acaba (a informação de fim de transmissão é o stop-bit) o bloco de dados e qual a sua posição na sequência de dados transmitidos.

inserir a descrição da imagem aqui

Exemplo:

function foo(){
    console.log("Executando algo assíncrono aqui");
}
function bar(){
    setTimeout(foo, 0);
    console.log("Alguma coisa por aqui");
    console.log("...");
}
bar();


Aqui não há a mesma sincronização que noutro exemplo, uma função não vai esperar pelo término da outra. Nesse exemplo usamos a função setTimeout para enfileirar foo que vai executar 0 ms após o loop de eventos, o loop de eventos ficará indisponível até completar sua atual pilha de execução - neste caso, o resto de bar, que inclui as duas declarações console.log. Após o término de bar o loop de eventos fica livre, e assim foo pode ser executada.

Saída:


Alguma coisa por aqui
...
Executando algo assíncrono aqui



Quando e para que devo usá-las? Grande parte do processo de tomada de decisão sobre isso envolve o senso comum, um conjunto de fatores, uma comunicação assíncrona pode ser usado quando a resposta não tenha que ser entregue urgentemente, esse tipo de comunicação é adequado para situações em que não seja necessário a entrega urgente dos dados, por outro lado, não seria apropriado usar esse tipo de comunicação se você precisa de interação imediata. Já a comunicação síncrona é ideal quando se precisa de espontaneidade, como em uma conversa em tempo real entre duas ou mais pessoas.

Tanto a comunicação síncrona, quanto a assíncrona, têm suas vantagens e desvantagens, utilizar uma ou outra vai depender da necessidade da sua aplicação.

segunda-feira, 29 de março de 2021

WINDOWS FORMS - DATAGRIDVIEW, OBTER O ÍNDICE DA GRID

 int indice = dgvTabelaParticulaAdicionar.CurrentCell.RowIndex; 


DataGridViewCell.RowIndex 

Obtém o índice da linha pai da célula.

WINDOWS FORMS C# - ALINHAR À DIREITA UMA COLUNA DO DATAGRIDVIEW

É bem simples. Basta definir a constantes que indicam o alinhamento de conteúdo dentro de uma célula DataGridView


 dgvTabelaParticulaAdicionar.Columns[6].DefaultCellStyle.Alignment =                                      

         DataGridViewContentAlignment.TopRight;


Campos

CAMPOS
BottomCenter512

O conteúdo é alinhado verticalmente na parte inferior e horizontalmente no centro de uma célula.

BottomLeft256

O conteúdo é alinhado verticalmente na parte inferior e horizontalmente à esquerda de uma célula.

BottomRight1024

O conteúdo é alinhado verticalmente na parte inferior e horizontalmente à direita de uma célula.

MiddleCenter32

O conteúdo é alinhado no centro vertical e horizontal de uma célula.

MiddleLeft16

O conteúdo é alinhado verticalmente no meio e horizontalmente à esquerda de uma célula.

MiddleRight64

O conteúdo é alinhado verticalmente no meio e horizontalmente à direita de uma célula.

NotSet0

O alinhamento não está definido.

TopCenter2

O conteúdo é alinhado verticalmente na parte superior e horizontalmente no centro de uma célula.

TopLeft1

O conteúdo é alinhado verticalmente na parte superior e horizontalmente à esquerda de uma célula.

TopRight4

O conteúdo é alinhado verticalmente na parte superior e horizontalmente à direita de uma célula.

Formatar TextBox Valores Decimais

 Adicione um TextBox ao seu projeto e faça as seguintes alterações:

string valor;
        private void txt_valor_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && e.KeyChar != Convert.ToChar(Keys.Back))
            {
                if (e.KeyChar == ',')
                {
                    e.Handled = (txt_valor.Text.Contains(","));
                }
                else
                    e.Handled = true;
            }            
        }

        private void txt_valor_Leave(object sender, EventArgs e)
        {
            valor = txt_valor.Text.Replace("R$", "");
            txt_valor.Text = string.Format("{0:C}", Convert.ToDouble(valor));
        }

        private void txt_valor_KeyUp(object sender, KeyEventArgs e)
        {
        	valor = txt_valor.Text.Replace("R$","").Replace(",","").Replace(" ","").Replace("00,","");
        	if(valor.Length == 0)
        	{
        		txt_valor.Text = "0,00"+valor;
        	}
        	if(valor.Length == 1)
        	{
        		txt_valor.Text = "0,0"+valor;
        	}
        	if(valor.Length == 2)
        	{
        		txt_valor.Text = "0,"+valor;
        	}
        	else if(valor.Length >= 3)
        	{
        		if(txt_valor.Text.StartsWith("0,"))
        		{
        			txt_valor.Text = valor.Insert(valor.Length - 2,",").Replace("0,","");
        		}
        		else if(txt_valor.Text.Contains("00,"))
        		{
        			txt_valor.Text = valor.Insert(valor.Length - 2,",").Replace("00,","");
        		}
        		else
        		{
        			txt_valor.Text = valor.Insert(valor.Length - 2,",");
        		}
        	}        	
        	valor = txt_valor.Text;
            txt_valor.Text = string.Format("{0:C}", Convert.ToDouble(valor));
            txt_valor.Select(txt_valor.Text.Length,0);
        }


quarta-feira, 17 de março de 2021

DATAGRIDVIEW - AJUSTAR AS COLUNAS DE FORMA AUTOMÁTICA

Propriedade: DataGridView.AutoSizeColumnsMode 



Esta propriedade Obtém ou define um valor que indica como as larguras de coluna são determinadas.

public System.Windows.Forms.DataGridViewAutoSizeColumnsMode AutoSizeColumnsMode { get; set; }

Essa propriedade permite que você configure o controle para que as larguras das colunas sejam ajustadas automaticamente para preencher o controle ou ajustar o conteúdo da célula. Os ajustes de tamanho ocorrem no modo de preenchimento sempre que a largura do controle é alterada


 dataGridView_ExamePacienteDupicados.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

segunda-feira, 8 de março de 2021

TRUNCATE TABLE (Transact-SQL)

 Remove todas as linhas de uma tabela ou partições especificadas de uma tabela sem registrar as exclusões de linha individual. TRUNCATE TABLE é semelhante à instrução DELETE sem nenhuma cláusula WHERE; entretanto, TRUNCATE TABLE é mais rápida e utiliza menos recursos de sistema e log de transações.

-- Syntax for SQL Server and Azure SQL Database

TRUNCATE TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name } [ WITH ( PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n ] ) ) ] [ ; ]

Argumentos

database_name
É o nome do banco de dados.

schema_name
É o nome do esquema ao qual a tabela pertence.

table_name
É o nome da tabela a ser truncada ou da qual todas as linhas são removidas. table_name deve ser um literal. table_name não pode ser a função OBJECT_ID() nem uma variável.

WITH ( PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n ] ) )
Aplica-se aSQL Server (SQL Server 2016 (13.x) até a versão atual)

Especifica as partições para truncar ou das quais todas as linhas são removidas. Se a tabela não for particionada, o argumento WITH PARTITIONS ON PARTITIONS gerará um erro. Se a cláusula WITH PARTITIONS não for fornecida, a tabela inteira será truncada.

<partition_number_expression> pode ser especificado das seguintes maneiras:

  • Forneça o número de uma partição, por exemplo: WITH (PARTITIONS (2))

  • Forneça os números de várias partições individuais separados por vírgulas, por exemplo: WITH (PARTITIONS (1, 5))

  • Forneça os intervalos e as partições individuais, por exemplo: WITH (PARTITIONS (2, 4, 6 TO 8))

  • <range> pode ser especificado como números de partições separados pela palavra TO, por exemplo: WITH (PARTITIONS (6 TO 8))

Para truncar uma tabela particionada, a tabela e os índices deverão estar alinhados (particionados na mesma função de partição).


Restrições

Você não pode usar TRUNCATE TABLE em tabelas que:

  • São referenciadas por uma restrição FOREIGN KEY. É possível truncar uma tabela que tenha uma chave estrangeira que referencie a ela mesma.

  • Participam de uma exibição indexada.

  • São publicadas com replicação transacional ou replicação de mesclagem.

  • São temporais com controle de versão do sistema.

  • São referenciadas por uma restrição EDGE.


Permissões

A permissão mínima necessária é ALTER em table_name. As permissões TRUNCATE TABLE são padronizadas para o proprietário da tabela, os membros da função de servidor fixa sysadmin e as funções de banco de dados fixas db_owner e db_ddladmin, e não podem ser transferidas. Entretanto, você pode incorporar a instrução TRUNCATE TABLE dentro de um módulo, como um procedimento armazenado, e conceder permissões adequadas ao módulo por meio da cláusula EXECUTE AS.

segunda-feira, 18 de janeiro de 2021

HISTÓRIA DA INTERNET MÓVEL


    Veja como a Internet evoluir em um curto espaço de anos. 

    Ao ver a figura tente imaginar tudo que ela nos proporciona e proporcionou ao longo dos anos.