Sunday 31 December 2017

Contador assíncrono waitforexit


Estou usando o PowerShell v2.0 para executar um determinado processo usando um objeto System. Diagnostics. Process, interceptando mensagens stdoutstderr de forma assíncrona, escrevendo o respectivo EventArgs. Data para o host (para fins de depuração) e pré-pendente com um timestamp, em última análise para Objetivos de logging: Espero que as mensagens do stdoutstderr escritas no console para que os timestamps sejam separados um segundo (como o ping grava no pipeline a cada segundo, obviamente), mas, por algum motivo, os timestamps são todos dentro de cerca de 10 milissegundos um do outro, de modo que os eventos registrados São obviamente disparando quando o processo é concluído. Então estou esperando isso: 2017-11-27 14: 53: 15.6581302 ExecCmd: Pingando o google 172.217.17.110 com 32 bytes de dados: 2017-11-27 14: 53: 15.8778445 ExecCmd: Responder a partir de 172.217.17.110: bytes32 time1ms TTL59 2017 -11-27 14: 53: 16.6796113 ExecCmd: Responder a partir de 172.217.17.110: bytes32 time1ms TTL59 2017-11-27 14: 53: 17.7548025 ExecCmd: Responder a partir de 172.217.17.110: bytes32 time1ms TTL59 etc. Mas, em vez disso, vendo isso. 2017-11-26 19: 00: 53.0813327 ExecCmd: Pingando o google 172.217.17.46 com 32 bytes de dados: 2017-11-26 19: 00: 53.0842700 ExecCmd: Responder a partir de 172.217.17.46: bytes32 time1ms TTL59 2017-11-26 19 : 00: 53.0860183 ExecCmd: Responder a partir de 172.217.17.46: bytes32 time1ms TTL59 2017-11-26 19: 00: 53.0899003 ExecCmd: Responder a partir de 172.217.17.46: bytes32 time1ms TTL59 etc. Ive recriou isso em C usando Framework v2.0 (Como estou usando PSv2) e funciona como esperado. Código para referência: o que eu estou faltando Eu não entendo porque efetivamente o mesmo código funciona em C, mas não em PS com a mesma versão de estrutura. Omitindo a declaração Process. WaitForExit (1000) retorna os valores de timestamp corretos, então eu sei que o PS é capaz de retornar os valores corretos. O mais próximo que posso obter é substituir a instrução if (Process. WaitForExit (10000)) por uma instrução while (Process. HasExited). Isso funciona, mas não é uma solução viável, uma vez que (compreensivelmente) mata a CPU - e estranhamente, adicionar Start-Sleep x faz com que o processo não saia. Eu joguei com o evento Process. Exited, mas isso faz com que o processo nunca saia, embora o evento ocorra e o evento Process. HasExited retorna verdadeiro. Da mesma forma, criar um objeto Timer e verificar Process. HasExited faz com que o processo nunca saia também. Eu vi muitas perguntas relacionadas à captura de stdoutstderr de forma assíncrona com objetos de processo no PS, mas não consegui encontrar nenhuma questão específica relacionada ao meu caso de uso. Qualquer helpadviceguidance seria muito apreciado como eu estou coçando minha cabeça com este Obrigado antecipadamente perguntou 27 de novembro às 15:38 Eu acho que I39m confuso porque se você comentar o If (Process. WaitForExit (10000)) bloquear e cancelar o registro de declarações de eventos No meu exemplo de código PS, embora o processo nunca se cale neste exemplo, ele escreve pelo menos corretamente no console em tempo real - então, ele se sente como Process. WaitForExit () bloqueia eventos em tempo real a partir do disparo (ao contrário de seu contra - Parte em C). Obrigado pela sua entrada, porém, não percebi isso sobre Get-Date e TimeGenerated. Ndash sthounsell 28 de novembro às 9:54 Eu não consegui descobrir como exibir stdouterr cai em tempo real no console e escrevendo para arquivar com valores adicionais (timestamp etc) ao se inscrever nos eventos Process. OutputDataReceived e ErrorDataReceived, então no final eu Mudou de tato e acabou fazendo o seguinte: Isso funciona, no entanto, não tenho certeza se é a melhor prática ou não - parece ser eficiente e confiável. Contadores síncronos Capítulo 11 - Circuitos seqüenciais Na seção anterior, vimos um circuito usando um JK flip-flop que contou para trás em uma seqüência binária de dois bits, de 11 a 10 para 01 a 00. Como seria desejável ter um circuito que pudesse contar para frente e não apenas para trás, valeria a pena examinar uma frente Regra de contagem novamente e procure mais padrões que possam indicar como construir esse circuito. Uma vez que sabemos que as seqüências de contagem binária seguem um padrão de divisão de freqüência de oitava (fator de 2) e que os multivibradores de flip-flop JK configurados para o modo de alternância são capazes de executar esse tipo de divisão de freqüência, podemos imaginar um circuito feito De vários flip-flops JK, em cascata para produzir quatro bits de saída. O principal problema que enfrenta é determinar como conectar esses flip-flops juntos para que eles alternem nos momentos certos para produzir a seqüência binária apropriada. Examine a seguinte seqüência de contagem binária, prestando atenção aos padrões que precedem a troca de um bit entre 0 e 1: Note que cada bit nesta seqüência de quatro bits alterna quando o bit antes dele (o bit com menor significado ou peso de lugar ), Alterna em uma direção particular: de 1 a 0. As pequenas setas indicam os pontos na seqüência em que um bit alterna, a cabeça da seta apontando para o período anterior de transição de um estado alto (1) para baixo (0) Estado: começando com quatro flip-flops JK conectados de forma a estar sempre no modo de alternância, precisamos determinar como conectar as entradas do relógio de tal forma que cada bit sucessivo alterna quando o bit antes dele transitar de 1 Para 0. As saídas Q de cada flip-flop servem como os respectivos bits binários da contagem final de quatro bits: se usássemos flip-flops com gatilho de borda negativa (símbolos de bolha nas entradas do relógio), poderíamos simplesmente Conecte a entrada do relógio de cada flip-flop à saída Q do f Antes de ele, de modo que, quando o bit antes de mudar de 1 para 0, a borda descendente desse sinal acenderia o próximo flip-flop para alternar o próximo bit: Este circuito renderia as seguintes formas de onda de saída, quando Sincronizado por uma fonte repetitiva de pulsos de um oscilador: o primeiro flip-flop (o que tem a saída Q 0), tem uma entrada de relógio ativada de borda positiva, de modo que ele alterna com cada flanco ascendente do sinal do relógio. Observe como o sinal de relógio neste exemplo tem um ciclo de trabalho inferior a 50. Eu mostrei o sinal desta maneira com a finalidade de demonstrar como o sinal de clock não precisa ser simétrico para obter bits de saída confiáveis ​​e limpos em nossa seqüência binária de quatro bits . No primeiro circuito de flip-flop mostrado neste capítulo, usei o próprio sinal de relógio como um dos bits de saída. No entanto, esta é uma prática ruim no design de contador, pois requer o uso de um sinal de onda quadrada com um ciclo de trabalho 50 (tempo muito baixo) para obter uma seqüência de contagem onde cada passo pausa para a mesma quantidade de Tempo. Usando um flip-flop J-K para cada bit de saída, no entanto, alivia-nos a necessidade de ter um sinal de relógio simétrico, permitindo o uso de praticamente qualquer variedade de forma de onda alta para incrementar a seqüência de contagem. Conforme indicado por todas as outras setas no diagrama de pulso, cada bit de saída sucessivo é alternado pela ação da transição de bits anterior de alta (1) para baixa (0). Este é o padrão necessário para gerar uma seqüência de contagem. Uma solução menos óbvia para gerar uma seqüência de seqüência usando flip-flops com giro de borda positiva é registrar cada flip-flop usando a saída Q do flip-flop anterior em vez da saída Q. Uma vez que a saída Q sempre será o estado exacto o oposto da saída Q em um flip-flop JK (sem estados inválidos com este tipo de flip-flop), uma transição alta para baixa na saída Q será acompanhada por um Transição de baixa a alta na saída Q. Em outras palavras, cada vez que a saída Q de um flip-flop transita de 1 para 0, a saída Q do mesmo flip-flop passará de 0 para 1, proporcionando o pulso de pulso positivo que precisamos para alternar um positivo - edge disparou flip-flop no momento certo: uma maneira de expandir as capacidades de qualquer um desses dois contadores de circuitos é considerar as saídas Q como outro conjunto de quatro bits binários. Se examinarmos o diagrama de pulso para tal circuito, vemos que as saídas Q geram uma seqüência de contagem decrescente, enquanto as saídas Q geram uma seqüência de contagem ascendente. Infelizmente, todos os contadores mostrados podem compartilhar um problema comum: o efeito cascata. Este efeito é visto em certos tipos de circuitos de adição binária e de conversão de dados, e é devido a atrasos de propagação acumulados entre portões em cascata. Quando a saída Q de um flip-flop passa de 1 para 0, ele comando o próximo flip-flop para alternar. Se o próximo alternar flip-flop for uma transição de 1 para 0, ele irá comandar o flip-flop depois de ele alternar também, e assim por diante. No entanto, uma vez que existe sempre uma pequena quantidade de atraso de propagação entre o comando para alternar (o pulso de relógio) e a resposta de alternância real (Q e Q produzem estados em mudança), todos os flip-flops subsequentes a serem alternados alternarão algum tempo após a O primeiro flip-flop mudou. Assim, quando vários bits alternam em uma seqüência de contagem binária, não todos alternarão ao mesmo tempo: como você pode ver, quanto mais bits forem alternados com um determinado pulso de relógio, mais severo será o tempo de atraso acumulado de LSB para MSB . Quando um pulso de relógio ocorre em um ponto de transição (digamos, na transição de 0111 a 1000), os bits de saída irão seqüelir em sequência de LSB para MSB, pois cada bit sucessivo alterna e comanda o próximo bit para alternar também, com Uma pequena quantidade de atraso de propagação entre cada bit basculante. Se analisarmos este efeito durante a transição de 0111 a 1000, veremos que haverá falsas contagens de saída geradas no breve período de tempo em que o efeito de ondulação ocorre: em vez de uma transição limpa de uma saída 0111 Para uma saída de 1000, o circuito do contador irá ondular muito rapidamente de 0111 a 0110 a 0100 a 0000 a 1000, ou de 7 a 6 a 4 a 0 e, em seguida, a 8. Esse comportamento gera o circuito contador o nome do contador ondulado. Ou contador assíncrono. Em muitas aplicações, este efeito é tolerável, uma vez que a ondulação acontece muito, muito rapidamente (a largura dos atrasos tem sido exagerada aqui como um auxílio para a compreensão dos efeitos). Se tudo o que queríamos fazer fosse dirigir um conjunto de diodos emissores de luz (LEDs) com as saídas dos contadores, por exemplo, essa breve ondulação não teria nenhuma conseqüência. No entanto, se desejássemos usar este contador para dirigir as entradas selecionadas de um multiplexador, indexe um ponteiro de memória em um circuito de microprocessador (computador) ou execute alguma outra tarefa em que as saídas falsas possam causar erros espúrios, não seria aceitável. Existe uma maneira de usar esse tipo de circuito contador em aplicações sensíveis a saídas falsas geradas por ondulações, e envolve um princípio conhecido como estroboscópio. A maioria dos circuitos decodificador e multiplexador estão equipados com pelo menos uma entrada chamada habilitação. A (s) saída (s) de um tal circuito estará ativa somente quando a entrada de habilitação for ativada. Podemos usar esta entrada de habilitação para estalar o circuito que recebe a saída dos contadores de ondulação, de modo que esteja desativado (e, portanto, não responda à saída do contador) durante o breve período de tempo em que as saídas do contador podem estar ondulando e ativadas somente quando suficientes O tempo passou desde o último pulso de relógio que todos os rippling terão cessado. Na maioria dos casos, o sinal de estroboscópio pode ser o mesmo pulso de relógio que impulsiona o circuito do contador: Com uma entrada ativa baixa, o circuito de recepção responderá à contagem binária do contador de quatro bits somente quando o sinal do relógio estiver baixo . Assim que o pulso de relógio for alto, o circuito de recepção deixa de responder à saída dos circuitos contadores. Uma vez que o circuito do contador está acionador de borda positiva (conforme determinado pela primeira entrada do relógio de flip-flop), toda a ação de contagem ocorre na transição de baixo para alto do sinal do relógio, o que significa que o circuito de recepção ficará desabilitado apenas Antes que ocorra qualquer alternância nos circuitos do contator, quatro bits de saída. O circuito de recepção não será ativado até que o sinal do relógio regresse a um estado baixo, o que deve ser um tempo bastante longo depois de todo o ondulante ter deixado de ser seguro para permitir que a nova contagem tenha efeito no circuito de recepção. O parâmetro crucial aqui é o sinal de clock em alta: deve ser pelo menos tão longo quanto o período de ripple esperado máximo do circuito contador. Caso contrário, o sinal de relógio habilitará prematuramente o circuito de recepção, enquanto ainda há ondulações. Outra desvantagem do circuito contador assíncrono ou ondulado é a velocidade limitada. Enquanto todos os circuitos do portão são limitados em termos de freqüência máxima do sinal, o design de contadores assíncronos compõe este problema, tornando os atrasos de propagação aditivos. Assim, mesmo que o strobing seja usado no circuito de recepção, um circuito contador assíncrono não pode ser sincronizado a qualquer freqüência maior que a que permite que o maior atraso de propagação acumulado possa decorrer bem antes do próximo impulso. A solução para este problema é um circuito contador que evita a ondulação completamente. Esse circuito de contador eliminaria a necessidade de projetar um recurso de estroboscópio em qualquer circuito digital que use a saída do contador como entrada, e também desfrutaria de uma velocidade de operação muito maior do que o equivalente assíncrono. Este design do circuito contador é o assunto da próxima seção. REVISÃO: um contador de cima pode ser feito conectando as entradas de relógio de flip-flops J-K desencadeados de borda positiva às saídas Q dos flip-flops anteriores. Outra maneira é usar flip-flops disparados de borda negativa, conectando as entradas de relógio às saídas Q dos flip-flops anteriores. Em ambos os casos, as entradas J e K de todos os flip-flops estão conectadas a V cc ou V dd para sempre estarem altas. Os circuitos de contador feitos a partir de flip-flops em cascata J-K onde cada entrada de relógio recebe seus impulsos a partir da saída do flip-flop anterior exibem invariavelmente um efeito de ondulação. Onde as contas de saída falsas são geradas entre algumas etapas da seqüência de contagem. Esses tipos de contadores de circuitos são chamados de contadores assíncronos. Ou contadores de ripple. Strobing é uma técnica aplicada aos circuitos que recebem a saída de um contador assíncrono (ondulação), de modo que as contagens falsas geradas durante o tempo de ondulação não terão efeito negativo. Essencialmente, a entrada de habilitação de um tal circuito está conectada aos contadores do pulso de relógio de forma a que ele seja ativado somente quando as saídas do contador não estão mudando e serão desabilitadas durante os períodos de mudança das saídas do contador onde ocorre ondulação. Larr Página anterior

No comments:

Post a Comment