Waitforexistence
Waitforexistence
Obter através da App Store Leia esta publicação em nosso aplicativo!
Como esperar até File. Exists?
Eu tenho um aplicativo, ouvindo o arquivo *.log em uma pasta escolhida. Eu usei FileSystemWatcher.
Mas há um problema. O outro aplicativo responsável por fazer esse arquivo leva as seguintes etapas:
Faça um arquivo *.gz Descompactar para o arquivo txt (algum nome de arquivo aleatório) Altere o nome *.txt para um apropriado com *.log de extensão.
E não consigo alterar esse comportamento.
Então eu fiz 2 FileSystemWatcher s para arquivos *.gz e *.txt. Por quê? Como este aplicativo às vezes não descompacta o arquivo gz e, às vezes, não muda o nome do arquivo txt para o arquivo *.log final.
FileSystemWatcher2 captura o arquivo txt, então (na maioria dos casos, ele é renomeado para logar os próximos 1000ms) Preciso esperar algum tempo para verificar se o arquivo txt existe (se não, parece ser renomeado para o arquivo *.log final) .
A questão é, como verificar se o arquivo existe sem Thread. Sleep () para prevenir a congelação de UI?
Espero que seja claro, se não, vou tentar descrevê-lo melhor. Eu acho que este é um problema complexo.
Alguma amostra de código:
Observador para arquivo gz:
Observador para o arquivo txt:
Na verdade, FileSystemWatcher Criado evento chamado em separado thread por si só .. Então, basicamente, você precisa fazer absolutamente nada. Seu código está OK como está.
Aqui está a prova:
Você pode usar um BackGroundWorker para monitorar o sistema de arquivos - e evitar o congelamento da UI.
Você pode usar o modo de suspensão sem bloquear o segmento de interface do usuário, você essencialmente mantém um segmento separado.
Em seguida, chame isso como:
Ou, como mencionado em outro post, use um BackGroundWorker no lugar do thread separado, coloque o código que mencionei no DoWork e ouça o evento OnFinish, mas vendo como não há muito trabalho para fazer qualquer um dos métodos estão bem.
Страница.
Пользователь.
Definições de serviço, solicitação de mensagens e mensagens de resposta.
Os serviços ROS são definidos por arquivos srv, que contém uma mensagem de solicitação e uma mensagem de resposta. Estas são idênticas às mensagens usadas com tópicos ROS (veja a visão geral da mensagem roscpp). o roscpp converte esses arquivos srv em código-fonte C ++ e cria três classes com as quais você precisa estar familiarizado: definições de serviço, mensagens de solicitação e mensagens de resposta. Os nomes dessas classes vêm diretamente do nome do arquivo srv:
Estrutura Gerada O gerador do serviço roscpp gera uma estrutura como esta:
A classe Request fornece a entrada para o serviço. A classe Response é retornada ao cliente como saída do serviço.
Criando solicitação de serviço / respostas.
Existem duas versões de qualquer método de chamada de serviço: um que leva, por exemplo, a estrutura Foo mostrada acima e uma que tenha objetos de solicitação e resposta separados. O preenchimento é muito simples. Para usar a própria estrutura de Foo:
Calling Services.
Existem duas maneiras de chamar um serviço em roscpp, o caminho "manipular" e o modo "desnudo".
Por conveniência, o espaço de nome ros :: service fornece um método de chamada, que não requer a criação de um NodeHandle:
O espaço de nomes ros :: service também fornece algumas funções de conveniência, como existe () e waitForService (). Consulte os documentos da API ros :: service namespace para obter mais informações.
A maneira do identificador funciona mais parecido com o funcionamento do resto da roscpp, na medida em que você é devolvido um :: ServiceClient que é usado para chamar o serviço:
ros :: ServiceClient também tem uma série de outros métodos úteis tais como existe () e waitForExistence (). Consulte os documentos da API ros :: ServiceClient para obter mais informações.
Conexões persistentes.
O ROS também permite conexões persistentes aos serviços. Com uma conexão persistente, o cliente permanece conectado a um serviço. Caso contrário, um cliente normalmente faz uma pesquisa e se reconecta em um serviço de cada vez. Isso potencialmente permite que um cliente se conecte a um nó diferente sempre que faz uma chamada de serviço, assumindo que a pesquisa retorna um nó diferente.
As conexões persistentes devem ser usadas com cuidado. Eles melhoram consideravelmente o desempenho para solicitações repetidas, mas também tornam seu cliente mais frágil para falhas no serviço. Os clientes que usam conexões persistentes devem implementar sua própria lógica de reconexão no caso de falhar a conexão persistente.
Você pode criar uma conexão persistente usando o segundo argumento opcional para ros :: NodeHandle :: serviceClient ():
Nota: com serviços persistentes, você pode saber se a conexão falhou ao testar o identificador:
ros :: As alças do ServiceClient são contabilizadas internamente, para que possam ser copiadas e, uma vez que a última cópia é destruída, a conexão persistente irá cair. Você também pode desligar manualmente a conexão com o método ros :: ServiceClient :: shutdown ().
Prestação de serviços.
No roscpp você fornece um serviço criando um ros :: ServiceServer através do método ros :: NodeHandle :: advertiseService (). advertiseService () funciona muito parecido com o funcionamento do método subscribe (), na medida em que você fornece um nome de serviço e uma chamada de retorno para serem chamados quando o serviço é chamado.
Há várias versões diferentes do advertiseService (), para diferentes tipos de retorno de chamada, mas a assinatura geral é:
MReq [geralmente desnecessário] Este é um argumento de modelo que especifica o tipo de mensagem de solicitação. Para a maioria das versões, você não precisa definir explicitamente isso, pois o compilador pode deduzi-lo da função de retorno de chamada.
MRes [geralmente desnecessário] Este é um argumento de modelo que especifica o tipo de mensagem de resposta. Para a maioria das versões, você não precisa definir explicitamente isso, pois o compilador pode deduzi-lo da função de retorno de chamada.
serviço O nome do serviço a ser fornecido.
Assinatura de devolução de chamada.
A assinatura do retorno de chamada do serviço é:
onde MReq e MRes combinam os tipos de solicitação / resposta fornecidos para anunciarService (). Um valor de retorno de verdade significa que o serviço foi bem sucedido e o objeto de resposta foi preenchido com os dados necessários. Um valor de retorno de falso significa que a chamada falhou e o objeto de resposta não será enviado para o chamador.
Tipos de retorno de chamada.
o roscpp suporta qualquer retorno de chamada suportado por boost :: function: métodos de classe de funções.
As funções são as mais fáceis de usar:
Métodos de classe.
Os métodos de classe também são fáceis, embora exijam um parâmetro extra:
Objetos do Functor.
Um objeto functor é uma classe que declara o operador (), por exemplo:
Um funcador passado para anunciarService () deve ser copiado. O funde Foo pode ser usado com advertiseService () assim:
Nota: ao usar objetos do functor você deve especificar explicitamente os tipos de solicitação e resposta como argumentos de modelo, porque o compilador não pode deduzi-los neste caso.
Cabeçalhos de conexão de serviço.
Os cabeçalhos de conexão são uma característica de ROS Topics e ROS Services que permitem que metadados adicionais sejam enviados quando a conexão inicial for feita entre dois nós. O ROS usa esses cabeçalhos para transmitir informações básicas, como o callerid do cliente de conexão.
No caso dos serviços, este recurso pode ser personalizado para implementar recursos avançados como "sessões" (ou seja, cookies). Os clientes de serviços podem enviar metadados adicionais por conta própria, como um identificador para associar com o pedido.
Do lado do cliente, você pode passar um std :: map & lt; std :: string, std :: string & gt; para o método ros :: NodeHandle :: serviceClient () como seu terceiro argumento:
No lado do servidor, o objeto Solicitar tem um campo __connection_header, que é um ponteiro para um std :: map & lt; std :: string, std :: string & gt; .
Wiki: Roscpp / Visão Geral / Serviços (последним исправлял пользователь JonathanBohren 2012-03-14 15:35:24)
Tópico fixo waitForExistence.
Eu quero saber por que waitForExistence não funciona no ProcessTestObject.
eu estou fazendo o seguinte:
ProcessTestObject testObject = startApp (config. getApplicationName ());
Quando eu executo o script, ocorre uma exceção, porque o botão não é encontrado = & gt; O aplicativo não está totalmente carregado.
Eu pensei que poderia usar waitForExistence em vez de dormir (3)
Re: waitForExistence.
hmm, você tem uma maneira divertida de fazer perguntas ... é mais como uma declaração;) De qualquer forma aqui você vai ±
waitForExistence.
Re: waitForExistence.
oi é uma aplicação web?
Re: waitForExistence.
MrCoolK 270003CDF9 & # x200f; 2013-09-17T13: 45: 32Z.
oi é uma aplicação web?
não, uma aplicação java.
Re: waitForExistence.
hmm, você tem uma maneira divertida de fazer perguntas ... é mais como uma declaração;) De qualquer forma aqui você vai ±
waitForExistence.
Re: waitForExistence.
Y5QY_gerben_delange 270004Y5QY & # x200f; 2013-09-17T13: 49: 03Z.
hmm, você tem uma maneira divertida de fazer perguntas ... é mais como uma declaração;) De qualquer forma aqui você vai ±
waitForExistence.
Hm, estou usando a versão 8.
no docu há outra informação em waitForExistence ():
waitForExistence (double maximum_find_object_time, double find_object_wait_between_retry)
Aguarde a Existência dos Objetos.
testObject. waitForExistence (10,1); não espera o tempo máximo de 10 segundos.
Re: waitForExistence.
michho 270006NA53 & # x200f; 2013-09-17T14: 08: 24Z.
Hm, estou usando a versão 8.
no docu há outra informação em waitForExistence ():
waitForExistence (double maximum_find_object_time, double find_object_wait_between_retry)
Aguarde a Existência dos Objetos.
testObject. waitForExistence (10,1); não espera o tempo máximo de 10 segundos.
A partir da página, o link que você acabou de fornecer refere-se a:
Descrição detalhada: Normalmente, espera até que um objeto exista, mas para um processo, isso realmente nunca espera. Se o processo não existe, nunca o fará. Lança uma exceção se o processo tiver terminado. Os métodos RationalTestScript onObjectNotFound não são suportados.
Re: waitForExistence.
Y5QY_gerben_delange 270004Y5QY & # x200f; 2013-09-17T14: 12: 41Z.
A partir da página, o link que você acabou de fornecer refere-se a:
Descrição detalhada: Normalmente, espera até que um objeto exista, mas para um processo, isso realmente nunca espera. Se o processo não existe, nunca o fará. Lança uma exceção se o processo tiver terminado. Os métodos RationalTestScript onObjectNotFound não são suportados.
oh, sim, onde está certo :)
Eu usarei o sono em vez de waitForExistence.
Re: waitForExistence.
michho 270006NA53 & # x200f; 2013-09-17T14: 19: 35Z.
oh, sim, onde está certo :)
Eu usarei o sono em vez de waitForExistence.
Acho que o sono é uma má idéia porque, se o aplicativo não for aberto dentro desse período, você terá o mesmo erro.
Então, a solução é usar isso.
System. out. println ("não encontrou");
Isso garantirá que o script aguarde até que ele seja aberto.
Re: waitForExistence.
Oi, você tentou o botão (). WaitForExistance ()?
Re: waitForExistence.
MrCoolK 270003CDF9 & # x200f; 2013-09-17T18: 32: 05Z.
Acho que o sono é uma má idéia porque, se o aplicativo não for aberto dentro desse período, você terá o mesmo erro.
Então, a solução é usar isso.
System. out. println ("não encontrou");
Isso garantirá que o script aguarde até que ele seja aberto.
Esse é um loop terrível ... desperdiça muitos recursos do sistema e é potencialmente infinito quando o objeto nunca existirá. consertou isso para você:
Re: waitForExistence.
Y5QY_gerben_delange 270004Y5QY & # x200f; 2013-09-18T15: 33: 27Z.
Esse é um loop terrível ... desperdiça muitos recursos do sistema e é potencialmente infinito quando o objeto nunca existirá. consertou isso para você:
Eu apenas forneci a ele a abordagem de como lidar com essa situação.
Se você está preocupado com o tempo, basta adicionar um código ao tempo de captura e definir um código de caducidade.
Qual é a diferença entre o seu código e ter uma espera de existência por 60 segundos. Se você tem uma linha de código que faz isso, use um código longo.
Nesse caso, seu código é menos usado.
Meu código era fornecer-lhe uma abordagem não uma solução.
Desculpe pela dura frase.
Re: waitForExistence.
MrCoolK 270003CDF9 & # x200f; 2013-09-18T16: 56: 40Z.
Eu apenas forneci a ele a abordagem de como lidar com essa situação.
Se você está preocupado com o tempo, basta adicionar um código ao tempo de captura e definir um código de caducidade.
Qual é a diferença entre o seu código e ter uma espera de existência por 60 segundos. Se você tem uma linha de código que faz isso, use um código longo.
Nesse caso, seu código é menos usado.
Meu código era fornecer-lhe uma abordagem não uma solução.
Desculpe pela dura frase.
Eu apenas forneci a ele a abordagem de como lidar com essa situação.
Meu código era fornecer-lhe uma abordagem não uma solução.
Bem, então você poderia ter feito isso um pouco mais claro; Se você diz 'Então, a solução é usar isso', as pessoas podem ficar confusas.
Qual é a diferença entre o seu código e ter uma espera de existência por 60 segundos.
waitForExistence é vazio (), o meu código 'retorna' um booleano.
Desculpe pela dura frase.
sem dificuldades, talvez eu fosse um pouco grosseiro na minha última resposta.
Tópico: Odd Behavior for. WaitForExistence ()
Ferramentas de discussão.
Pesquisar Thread.
Modo linear Mude para o modo híbrido Mude para o modo roscado.
Comportamento estranho para. WaitForExistence ()
[Detalhes] Procurando [TextGuiTestObject (Nome: Text_TxtB_Color, Mapa: txtB_Color)] com o estado [ENABLED | VISIBLE | READY], possível candidato com falha [.classIndex: 1,.name: txtNotEnabledColor,.title:,.id:,. digite: texto] com estado incorreto [DESATIVADO]
Solução Parcial.
Gostaria de saber se alguém que usa o Firefox tenha sido capaz de usar. WaitForExistence () sob as condições aplicáveis (ou seja, o controle que está sendo verificado está desativado).
Também pode fornecer o rastreamento de exceção para o Firefox também.
Nesta situação particular, o tempo não é significativo. Eu criei uma página de exemplo para usar como teste para esta anomalia. A página da Web e todos os seus objetos estão presentes e disponíveis, então eu sei por 100% de certeza que o objeto deve ser encontrado. Na minha amostra, o objeto está lá, mas um dos atributos é definido de acordo: Ativado = Falso OU Desativado = Verdadeiro, dependendo de como é visto pela RFT. Além disso, neste exemplo, o tempo foi codificado: 10 segundos, atraso de 2 segundos entre a tentativa.
Veja a primeira postagem neste tópico.
Possivelmente, mas preciso de alguém para ajudar a suportar esta informação.
O mesmo código foi usado tanto para o IE quanto para o Firefox. Porque eu tenho que suportar dois navegadores, testei os dois. Fiquei surpreso ao ver que havia algumas diferenças no resultado. Minhas expectativas teriam sido que o mesmo código era ter trabalhado para ambos os navegadores.
Nenhuma solução alternativa disponível, a partir desta publicação.
Tags para este tópico.
Publicando Permissões.
Você não pode abrir novos tópicos Você não pode enviar respostas Você não pode enviar anexos Você não pode editar suas postagens.
BB Code is On Smilies is On [IMG] code is On [VIDEO] code is Off Código HTML está Desligado.
Recursos guardados nesta página: MySQL 12.00%
vBulletin Otimização fornecida pela vB Optimize v2.7.1 (Pro) - vBulletin Mods & amp; Addons Copyright & copy; 2017 DragonByte Technologies Ltd.
Sistema de Alerta do Usuário fornecido pelo Advanced User Tagging v3.3.0 (Pro) - vBulletin Mods & amp; Addons Copyright & copy; 2017 DragonByte Technologies Ltd.
Botões de Feedback fornecidos por Advanced Post Obrigado / Curto (Pro) - vBulletin Mods & amp; Addons Copyright & copy; 2017 DragonByte Technologies Ltd.
Mudança de nome de usuário fornecida por Mudança de nome de usuário (Grátis) - vBulletin Mods & amp; Addons Copyright & copy; 2017 DragonByte Technologies Ltd.
No comments:
Post a Comment