NX Lab

Hiển thị tiến độ cho tác vụ dài bằng Listing Window và thanh trạng thái (không dùng hộp thoại chặn)

#Python#Tiến độ1 lượt xem

  1. Quản trị viênQuản trị· 0 điểm

    Câu hỏi ·

    Xử lý 300 file mất cả giờ mà không có dấu hiệu gì khiến người dùng tưởng NX treo. Hiển thị tiến độ rõ ràng bằng số thứ tự, phần trăm và thời gian còn lại ước tính.

    Hiển thị tiến độ cho tác vụ dài bằng… Hiển thị tiến độ cho tác vụ dài bằng…

    Các bước thực hiện

    1. Tính tổng số việc. Quét danh sách trước khi bắt đầu.
    2. In dòng tiến độ. Chỉ số, phần trăm, tên đang xử lý.
    3. Ước tính thời gian còn lại. Trung bình các việc đã xong.
    4. Giảm tần suất in. Mỗi vài giây thay vì mỗi mục.
    5. Tổng kết. Thời gian tổng và số lỗi.

    Code tham khảo (Python)

    import time
    import NXOpen
    
    class TienDo:
        def __init__(self, tong, lw, giay_giua_hai_lan_in=2.0):
            self.tong, self.lw = tong, lw
            self.bat_dau = time.perf_counter()
            self.lan_in_cuoi = 0.0
            self.khoang = giay_giua_hai_lan_in
            self.xong = 0
    
        def buoc(self, ten):
            self.xong += 1
            bay_gio = time.perf_counter()
            if bay_gio - self.lan_in_cuoi >= self.khoang or self.xong == self.tong:
                da_qua = bay_gio - self.bat_dau
                con_lai = da_qua / self.xong * (self.tong - self.xong)
                self.lw.WriteLine("[%3d%%] %d/%d  %s  (còn khoảng %s)" % (
                    100 * self.xong // self.tong, self.xong, self.tong, ten[:40], dinh_dang(con_lai)))
                self.lan_in_cuoi = bay_gio
    
    def dinh_dang(giay):
        giay = int(giay)
        return "%d:%02d" % (giay // 60, giay % 60)
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        cac_viec = ["file_%03d.prt" % i for i in range(1, 31)]
        td = TienDo(len(cac_viec), lw, giay_giua_hai_lan_in=0.5)
        for ten in cac_viec:
            time.sleep(0.1)          # thay bằng công việc thật
            td.buoc(ten)
        lw.WriteLine("Hoàn tất sau %s" % dinh_dang(time.perf_counter() - td.bat_dau))
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Chỉ in khi đủ khoảng thời gian hoặc ở mục cuối để không làm chậm tác vụ bằng chính việc in.
    • Thời gian còn lại ước tính theo trung bình các mục đã xong, chính xác hơn khi các mục có độ nặng tương đương.
    • Lớp TienDo tách riêng nên dùng lại được trong mọi tác vụ hàng loạt.

    Lỗi thường gặp

    • Listing Window không tự cuộn xuống ở một số phiên bản; người dùng cần cuộn tay hoặc dùng log file song song.
    • Tuyệt đối tránh hộp thoại chặn (MessageBox) trong vòng lặp; chúng làm tác vụ dừng chờ người.

    Code mang tính tham khảo, viết cho NX 12 trở lên (Python journal). Tên menu và một số lớp có thể khác theo phiên bản NX; hãy chạy thử trên bản sao của chi tiết trước khi dùng cho dữ liệu thật.

    Điểm: 0

Trả lời

Đăng nhập để tham gia thảo luận.