Kullanıcı programının asılı olmadığını belirtmek için kaynak dostu bir yol


10

Bir noktada, 50.000 + metin satırı işleyen bir * nix sistemi üzerinde bir Perl komut dosyası var. Bu biraz zaman alıyor. Kullanıcı bu metnin tamamını işlerken programı asılı olmadığını bildirmek için kaynak dostu bir yol bulmaya çalışıyorum.

Şu anda metin işlenirken gerçek zamanlı olarak çıktı yazdırıyorum. Çıktı tamponunu yıkıyorum ve sonra çıktıyı bir satırda yazdırıyorum \r. Bu, gereksiz bir kaynak kullanımı gibi görünüyor çünkü hiçbir şey yazdırmamamdan neredeyse iki kat daha uzun sürüyor, ama dediğim gibi, hiçbir şey yazdırırken program asılı duruyor gibi görünüyor.

Yani sorum: Kullanıcıya uzun süren görevleri yerine getirirken programın gerçekten çalışmakta olduğunu bildirmenin standart veya basit bir yolu var mı?


Hangi unix? FreeBSD ise, Control-T (varsayılan Durum komutu olan) göndererek hala meşgul olup olmadığını kontrol edebilirsiniz .
Hennes

Yanıtlar:


6

[Sadece senaryonuz olduğunu fark perl , ama aynı mantık geçerlidir print "\r"Sen kullanmak isteyeceksiniz, vb STDERR, arabelleğe kapalı ya da başka bir dönüş $| = 1. Aşağıya bakın.]

CLI "ilerleme göstergesi" uygulamanın bir yolu \r(satırbaşı) karakterinin kullanılmasını içerir. Bu, imleci geçerli satırın başına getirir:

#!/bin/bash

count=0
while ((1)); do
    echo -ne "\rCount: $count"
    sleep 1;
    count=$(($count+1));
done     

Mantıklı değilse, sadece deneyin.

Şu ana kadar kaç satırın veya binlerce satırın işlendiğini belirtmek için bu tekniği kullanabilirsiniz. Onlarca veya yüzlerce çizgi iyi olmayabilir, çünkü çok sık değil (daha fazla güncelleme == daha yavaş çalışma zamanı), ancak ilerlemenin devam ettiğini göstermek için muhtemelen hala yeterli. Bir birim belirleyebilir veya yalnızca sıfır ekleyebilirsiniz.

Bunun -nve -ebununla birlikte kullanıldığına dikkat edin echo, bu önemlidir.

\bBenzer etkiyi elde etmek için (geri silme) tuşunu da kullanabilirsiniz .


Perl dilinde:

#!/usr/bin/perl
use strict;
use warnings FATAL => qw(all);

$| = 1;  # Pipeline stdout (i.e., no buffering).

my $count = 1;
while ($count) {
    print "\rCount $count";
    sleep 1;
    $count++;
}               

3

.İşlem yaparken bir satırsonu yazmadan tek bir çıktı alın . Eski teknik.

Yani şunu elde edersiniz:

Processing...............

Basit ve etkili.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.