Red de conocimiento del abogados - Respuesta jurídica de la empresa - Cómo lograr la sincronización multiproceso en Delphi

Cómo lograr la sincronización multiproceso en Delphi

Sincronización multiproceso

"Sección crítica": cuando un fragmento de código se coloca en una sección crítica, cuando el hilo ejecuta la sección crítica, será exclusivo y permitirá que otros El hilo que ejecuta este código también debe esperar primero;

El formato de uso es el siguiente:

var?CS:?TRTLCriticalSection;{Declarar una variable de tipo de estructura?TRTLCriticalSection?;? debería ser Global}?

InitializeCriticalSection(CS);?{Initialization}?

EnterCriticalSection(CS);?{Inicio:?Es mi turno y otros hilos desaparecen}?

LeaveCriticalSection(CS);?{End:?Otros hilos pueden venir}?

DeleteCriticalSection(CS);?{Delete:?Tenga cuidado de no eliminar demasiado pronto}?

Ejemplo de sincronización multiproceso 1?unidad?Unidad1;?2?3?interfaz? ?Formularios,? 7Diálogos,?StdCtrls;? 8? 9?tipo?

10TForm1?=?class(TForm)?

11?ListBox1:?TListBox;?

12?Botón1:?TButton;?

13?procedure?FormCreate(Sender:?TObject);?

14?procedure?FormDestroy(Sender:?TObject) ;?

15?procedimiento?Botón1Clic(Remitente:?TObject);?

16end;?

17?

18? var?

19Form1:?TForm1;?

20?

21?implementación?

22?

23?{ $R?*.dfm}?

24?

25?var?

26CS:?TRTLCriticalSection;?

27?

28?función?MyThreadFun(p:?Pointer):?DWORD;?stdcall;?

29?var?

30i: ?Entero;?

31?comenzar?

32EnterCriticalSection(CS);?

33para?i?:=?0?a?99?do? Form1.ListBox1.Items.Add(IntToStr(i));?

34LeaveCriticalSection(CS);?

35Resultado?:=?0;?

36?end; ?

37?

38?procedure?TForm1.Button1Click(Remitente:?TObject);?

39?var?

40ID:?DWORD;?

41?begin?

42CreateThread(nil,?0,?@MyThreadFun,?nil,?0,?ID);?

43CreateThread(nil,?0,?@MyThr

eadFun,?nil,?0,?ID);?

44CreateThread(nil,?0,?@MyThreadFun,?nil,?0,?ID);?

45 ?end;?

46?

47?procedure?TForm1.FormCreate(Sender:?TObject);?

48?begin?

49ListBox1.Align?:=?alLeft;?

50InitializeCriticalSection(CS);?

51?end;?

52?

53?procedure?TForm1.FormDestroy(Sender:?TObject);?

54?begin?

55DeleteCriticalSection(CS);?

56?fin;?

57?

58?fin.