หมายเหตุพื้นหลัง:
เมื่อไม่นานมานี้ ฉันพัฒนาระบบการแปลงข้อมูล ตรรกะทางธุรกิจระบุว่าจำเป็นต้องบีบอัดข้อมูลเป็นรูปแบบ .tar.gz
ฉันใช้มันภายใต้ระบบ Windows ขั้นแรก ให้สร้างไฟล์แบตช์ จากนั้นเรียก WinExec เพื่อรันไฟล์แบตช์ รอสักระยะหนึ่ง และทำการบีบอัดข้อมูลอัตโนมัติให้เสร็จสิ้น
ต่อมาพบว่าขนาดของไฟล์ที่จะบีบอัดนั้นไม่แน่นอน และการพักเครื่องเป็นระยะเวลาหนึ่งเมื่อเรียกใช้งาน WinExec อาจทำให้การบีบอัดล้มเหลว ไฟล์ไม่สมบูรณ์หรือเสียหาย
แผนการเพิ่มประสิทธิภาพ:
แทนที่จะใช้ WinExe ให้ใช้ CreateProcess เพื่อเริ่มกระบวนการและดำเนินการไฟล์แบตช์ ในเวลาเดียวกัน ระบบจะกรอกโครงสร้าง TProcessInformation โดยอัตโนมัติ
ในเวลานี้ โปรแกรมจะบล็อกชุดงานโดยอัตโนมัติ โดยรอให้กระบวนการจัดการชุดงานสิ้นสุดหรือหมดเวลา วิธีนี้จะแก้ไขปัญหาความเสียหายของการบีบอัด
ยกตัวอย่างการสาธิต:
รหัส D7 มีดังนี้:
หน่วย uMain; อินเทอร์เฟซ Windows, ข้อความ, SysUtils, ตัวแปร, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม, กล่องโต้ตอบ, RzButton, StdCtrls; ประเภท TFrmMain = class (TForm) mmMsg: TMemo; TMemo; btnClear: TRzBitBtn; สตริง); btnExecuteClick (ผู้ส่ง: TObject); ขั้นตอน btnClearClick (ผู้ส่ง: TObject); ส่วนตัว { ประกาศส่วนตัว } สาธารณะ { ประกาศสาธารณะ } สิ้นสุด; var FrmMain: TFrmMain; การนำไปใช้งาน {$ R * .dfm} ขั้นตอน TFrmMain.MsgDsp (v_Str: string); เริ่มต้น mmMsg.Lines.Add('[ admin ] - [' + v_Str + '] - [' + FormatDateTime('YYYY-MM-DD hh:mm:ss zzz', Now()) + ']');end;ขั้นตอน TFrmMain.btnExecuteClick(ผู้ส่ง: TObject);var sInfo: TStartupInfo ; pInfo: TProcessInformation; cmdLine: string; exitCode: พระคาร์ดินัล; MsgDsp('พารามิเตอร์การเริ่มต้น'); cmdLine := 'C:/Program Files/7-Zip/7zFM.exe'; FillChar(sInfo, sizeof(sInfo), #0); sInfo.dwFlags := STARTF_USESHOWWINDOW; sInfo.wShowWindow := SW_NORMAL; MsgDsp('การกำหนดค่าเริ่มต้นพารามิเตอร์เสร็จสมบูรณ์ เริ่มการดีบัก WinExec'); //CreateProcess ถูกใช้เพื่อเริ่มกระบวนการ หลังจากกระบวนการเริ่มต้นขึ้น โครงสร้าง TProcessInformation จะถูกกรอก //ในขณะนี้ โปรแกรมถูกบล็อกใน หมายเลขอ้างอิง กำลังรอการสิ้นสุดกระบวนการของหมายเลขอ้างอิงหรือการหมดเวลาหากไม่ใช่ CreateProcess(nil, pchar(cmdLine), nil, nil, false, CREATE_NEW_CONSOLE หรือ NORMAL_PRIORITY_CLASS, nil, ไม่มี, sInfo, pInfo) จากนั้นเริ่ม MsgDsp ('การดีบัก WinExec ล้มเหลว! '); MessageBox(Application.handle, 'โปรแกรมที่ระบุล้มเหลวในการเริ่มต้น!', 'ข้อผิดพลาด', MB_OK หรือ MB_ICONSTOP); end else เริ่มต้น //รอให้กระบวนการของหมายเลขอ้างอิงที่ระบุสิ้นสุดหรือหมดเวลา WaitForSingleObject(pInfo.hProcess) , INFINITE); GetExitCodeProcess( pInfo.hProcess, exitCode); MsgDsp ('การดีบัก WinExec สำเร็จ!'); สิ้นสุด; สิ้นสุด; ขั้นตอน TFrmMain.btnClearClick(ผู้ส่ง: TObject);เริ่มต้น mmMsg.Clear;end;end
ผลการวิ่งมีดังนี้:
สรุป
ข้างต้นเป็นคำแนะนำของบรรณาธิการเกี่ยวกับการเรียกโปรแกรมภายนอกของ Delphi และการบล็อกโปรแกรมภายนอก ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉัน แล้วบรรณาธิการจะตอบกลับคุณทันเวลา ฉันอยากจะขอบคุณทุกคนที่ให้การสนับสนุนเว็บไซต์ Wulin.com!
หากคุณคิดว่าบทความนี้มีประโยชน์สำหรับคุณ คุณสามารถพิมพ์ซ้ำได้ โปรดระบุแหล่งที่มา ขอขอบคุณ!