古詩詞大全網 - 成語解釋 - delphi 怎麽實現多線程的同步

delphi 怎麽實現多線程的同步

多線程同步

"臨界區"(CriticalSection):?當把壹段代碼放入壹個臨界區,?線程執行到臨界區時就獨占了,?讓其他也要執行此代碼的線程先等等;

使用格式如下:

var?CS:?TRTLCriticalSection;?{聲明壹個?TRTLCriticalSection?結構類型變量;?它應該是全局的}?

InitializeCriticalSection(CS);?{初始化}?

EnterCriticalSection(CS);{開始:?輪到我了其他線程走開}?

LeaveCriticalSection(CS);{結束:?其他線程可以來了}?

DeleteCriticalSection(CS);?{刪除:?註意不能過早刪除}?

多線程同步示例

1?unit?Unit1;?

2

3?interface?

4

5?uses?

6?Windows,?Messages,?SysUtils,?Variants,?Classes,?Graphics,?Controls,?Forms,?

7?Dialogs,?StdCtrls;?

8

9?type?

10?TForm1?=?class(TForm)?

11?ListBox1:?TListBox;?

12?Button1:?TButton;?

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

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

15?procedure?Button1Click(Sender:?TObject);?

16?end;?

17

18?var?

19?Form1:?TForm1;?

20

21?implementation?

22

23?{$R?*.dfm}?

24

25?var?

26?CS:?TRTLCriticalSection;?

27

28?function?MyThreadFun(p:?Pointer):?DWORD;?stdcall;?

29?var?

30?i:?Integer;?

31?begin?

32?EnterCriticalSection(CS);?

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

34?LeaveCriticalSection(CS);?

35?Result?:=?0;?

36?end;?

37

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

39?var?

40?ID:?DWORD;?

41?begin?

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

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

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

45?end;?

46

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

48?begin?

49?ListBox1.Align?:=?alLeft;?

50?InitializeCriticalSection(CS);?

51?end;?

52

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

54?begin?

55?DeleteCriticalSection(CS);?

56?end;?

57

58?end.