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}? p>
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) ;? p>
15?procedimiento?Botón1Clic(Remitente:?TObject);?
16end;?
17?
18? var? p>
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.