Catatan Latar Belakang:
Beberapa waktu lalu saya mengembangkan sistem konversi data, logika bisnisnya menyatakan bahwa data perlu dikompres ke dalam format .tar.gz.
Saya menggunakannya di bawah sistem Windows. Pertama, buat file batch, lalu panggil WinExec untuk menjalankan file batch, tunggu beberapa saat, dan selesaikan kompresi data otomatis.
Belakangan, diketahui bahwa ukuran file yang akan dikompres tidak pasti, dan hanya tertidur selama waktu tertentu saat menjalankan WinExec dapat menyebabkan kegagalan kompresi, file tidak lengkap atau rusak.
Rencana pengoptimalan:
Alih-alih WinExe, gunakan CreateProcess untuk memulai proses dan menjalankan file batch. Pada saat yang sama, sistem akan secara otomatis mengisi struktur TProcessInformation.
Pada saat ini, program akan secara otomatis memblokir batch, menunggu proses pegangan batch berakhir atau batas waktu habis. Ini akan menyelesaikan masalah kerusakan kompresi.
Berikan contoh Demo:
Kode D7 adalah sebagai berikut:
unit uMain;antarmukamenggunakan Windows, Pesan, SysUtils, Varian, Kelas, Grafik, Kontrol, Formulir, Dialog, RzButton, StdCtrls;ketik TFrmMain = class(TForm) mmMsg: TMemo; tali); prosedur btnExecuteClick(Pengirim: TObject); prosedur btnClearClick(Pengirim: TObject); private { Deklarasi pribadi } public { Deklarasi publik } end;var FrmMain: TFrmMain;implementasi{$R *.dfm}prosedur TFrmMain.MsgDsp(v_Str: string); mulai mmMsg.Lines.Add('[ admin ] - [' + v_Str + '] - [' + FormatDateTime('YYYY-MM-DD hh:mm:ss zzz', Now()) + ']');end;prosedur TFrmMain.btnExecuteClick(Pengirim: TObject);var sInfo: TStartupInfo ; pInfo: TProcessInformation; cmdLine: string; exitCode: Kardinal;mulai MsgDsp('Parameter inisialisasi'); cmdLine := 'C:/Program Files/7-Zip/7zFM.exe'; sInfo.dwFlags := STARTF_USESHOWWINDOW; sInfo.wShowWindow := SW_NORMAL; MsgDsp('Inisialisasi parameter selesai, mulai debugging WinExec'); //CreateProcess digunakan untuk memulai proses. Setelah proses dimulai, struktur TProcessInformation akan diisi. //Saat ini, program diblokir di dalam. handle, menunggu akhir proses handle atau timeout jika tidak CreateProcess(nil, pchar(cmdLine), nil, nil, false, CREATE_NEW_CONSOLE atau NORMAL_PRIORITY_CLASS, nil, nihil, sInfo, pInfo) lalu mulai MsgDsp('Debug WinExec gagal! '); MessageBox(Application.handle, 'Program yang ditentukan gagal dimulai!', 'Error', MB_OK atau MB_ICONSTOP start //Tunggu proses dari handle yang ditentukan berakhir atau batas waktu WaitForSingleObject(pInfo.hProcess); , INFINITE); GetExitCodeProcess( pInfo.hProcess, exitCode); TFrmMain.btnClearClick(Pengirim: TObject);mulai mmMsg.Clear;akhir;akhir.
Efek yang berjalan adalah sebagai berikut:
Meringkaskan
Di atas adalah pengenalan editor tentang Delphi yang memanggil program eksternal dan memblokir program eksternal. Saya harap ini dapat membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan pesan kepada saya dan editor akan membalas Anda tepat waktu. Saya juga ingin mengucapkan terima kasih kepada semua orang atas dukungan Anda terhadap situs web Wulin.com!
Jika menurut Anda artikel ini bermanfaat, silakan cetak ulang, harap sebutkan sumbernya, terima kasih!