Tôi muốn thực hiện một quá trình con và đồng bộ hóa nó (có thể với Mutex) mà không cần chờ cho quá trình con để chấm dứt:Làm cách nào để đồng bộ hóa quá trình thực hiện quy trình Phụ huynh/Con?
phụ huynh:
program Project1;
{$APPTYPE CONSOLE}
uses
Windows, ShellApi, SysUtils, Dialogs;
procedure ShellExecEx(Wnd: HWND; const AExeFilename, AParams: string);
const
SEE_MASK_NOZONECHECKS = $00800000;
SEE_MASK_WAITFORINPUTIDLE = $02000000;
SEE_MASK_NOASYNC = $00000100;
var
Info: TShellExecuteInfo;
begin
FillChar(Info, SizeOf(Info), 0);
Info.Wnd := Wnd;
Info.cbSize := SizeOf(Info);
Info.fMask := SEE_MASK_FLAG_NO_UI or SEE_MASK_NOZONECHECKS or
SEE_MASK_NOASYNC
//or SEE_MASK_WAITFORINPUTIDLE (works only with UI app ???)
//or SEE_MASK_NO_CONSOLE
//or SEE_MASK_NOCLOSEPROCESS
;
Info.lpVerb := '';
Info.lpFile := PChar(AExeFilename);
Info.lpParameters := PChar(AParams);
Info.lpDirectory := PChar(ExtractFilePath(AExeFilename));
Info.nShow := SW_SHOWNORMAL;
if not ShellExecuteEx(@Info) then
RaiseLastOSError;
CloseHandle(Info.hProcess);
end;
var
Mutex: THandle = 0;
Error: DWORD;
begin
OutputDebugString('Project1 : 1');
ShellExecEx(0, 'Project2.exe', '');
// synchronize
repeat
// attempt to create a named mutex
Mutex := CreateMutex(nil, False, 'F141518A-E6E4-4BC0-86EB-828B1BC48DD1');
Error := GetLastError;
if Mutex = 0 then RaiseLastOSError;
CloseHandle(Mutex);
until Error = ERROR_ALREADY_EXISTS;
OutputDebugString('Project1 : 3');
end.
Child:
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows, Dialogs;
var
Mutex: THandle = 0;
begin
OutputDebugString('Project2 : 2');
// attempt to create a named mutex and acquire ownership
Mutex := CreateMutex(nil, True, 'F141518A-E6E4-4BC0-86EB-828B1BC48DD1');
if Mutex = 0 then RaiseLastOSError;
// do something
ReleaseMutex(Mutex);
CloseHandle(Mutex); // <- at this point Program1.exe should exit the repeat loop
ShowMessage('ok from Project2');
end.
Tôi hy vọng sẽ thấy kết quả của:
Project1 : 1
Project2 : 2
Project1 : 3
Vấn đề là đôi khi Parent (Project1.exe) không thoát khỏi vòng lặp.
Tôi đang làm gì sai?
10x, tôi nghi ngờ rằng thiết kế của tôi không chính xác. Tôi không thể nhận ra cách sử dụng 'WaitForSingleObject' trong trường hợp này ... Bạn có thể chỉ cho tôi cách viết mã đúng để xử lý các sự kiện như bạn đã giải thích không? – ZigiZ
OK, tôi đã thêm một số mã giả. Nó rất dễ. Bạn biết rõ làm thế nào để đọc tài liệu MSDN và tôi chắc chắn bạn có thể tự mình crack từ đây. –
Rực rỡ! 10x! – ZigiZ