วิธีที่เป็นมิตรกับทรัพยากรในการระบุถึงโปรแกรมผู้ใช้ไม่ได้หยุดทำงาน


10

ฉันมีสคริปต์ Perl บนระบบ * ระวังซึ่ง ณ จุดหนึ่งคือการประมวลผลข้อความ 50,000 บรรทัด ใช้เวลาพอสมควร ฉันพยายามค้นหาวิธีที่เป็นมิตรกับทรัพยากรเพื่อให้ผู้ใช้ทราบว่าโปรแกรมไม่ได้หยุดทำงานในขณะที่กำลังประมวลผลข้อความนี้ทั้งหมด

ขณะนี้ฉันกำลังพิมพ์เอาต์พุตแบบเรียลไทม์ขณะที่ข้อความกำลังถูกประมวลผล \rฉันกำลังล้างบัฟเฟอร์ส่งออกแล้วพิมพ์การส่งออกในบรรทัดเดียวกับ สิ่งนี้ดูเหมือนจะเป็นการใช้ทรัพยากรที่ไม่จำเป็นเพราะมันใช้เวลานานกว่าเกือบสองเท่าเมื่อฉันไม่พิมพ์อะไรเลย แต่อย่างที่ฉันบอกเมื่อพิมพ์อะไรเลยดูเหมือนว่าโปรแกรมกำลังถูกแขวน

ดังนั้นคำถามของฉัน: มีวิธีมาตรฐานหรือวิธีง่าย ๆ เพื่อให้ผู้ใช้ทราบว่าโปรแกรมกำลังทำงานจริง ๆ ในขณะที่ทำงานที่ต้องใช้เวลานานหรือไม่?


อันไหน ถ้าเป็น FreeBSD คุณสามารถตรวจสอบว่ามันยังยุ่งอยู่หรือไม่โดยส่ง Control-T (ซึ่งเป็นคำสั่งสถานะเริ่มต้น)
Hennes

คำตอบ:


6

[ฉันเพิ่งตระหนักสคริปต์ของคุณเป็นPerlแต่ตรรกะเดียวกันการสั่งprint "\r"ฯลฯ คุณจะต้องการใช้STDERRหรืออื่น ๆ $| = 1ที่ปิดบัฟเฟอร์ ดูด้านล่าง]

วิธีหนึ่งในการใช้งาน "ตัวบ่งชี้ความคืบหน้า" ของ CLI เกี่ยวข้องกับการใช้\rอักขระ (carriage return) สิ่งนี้จะนำเคอร์เซอร์ไปที่จุดเริ่มต้นของบรรทัดปัจจุบัน:

#!/bin/bash

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

ถ้ามันไม่เข้าท่าลองเลย

คุณสามารถใช้เทคนิคนั้นเพื่อระบุว่ามีการประมวลผลหลายบรรทัดหรือหลายพันบรรทัดแล้ว นับสิบหรือหลายร้อยบรรทัดอาจจะดีเพราะมันไม่บ่อยเกินไป (อัพเดตเพิ่มเติม == ช้าลงรันไทม์) แต่อาจยังบ่อยพอที่จะแสดงความคืบหน้าดำเนินการต่อ คุณสามารถระบุหน่วยหรือเพิ่มศูนย์

จดบันทึกการใช้งาน-nและ-eด้วยechoซึ่งเป็นสิ่งสำคัญ

นอกจากนี้คุณยังสามารถใช้\b(backspace) เพื่อเอฟเฟกต์ที่คล้ายกันได้


ใน Perl:

#!/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

พิมพ์ออกมา.โดยไม่ต้องขึ้นบรรทัดใหม่ในขณะที่คุณดำเนินการ เทคนิคเก่าอายุ

ดังนั้นคุณจะได้รับ:

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

ง่ายและมีประสิทธิภาพ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.