国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > C# > 正文

c# 多線程編程 入門篇

2020-01-31 20:52:23
字體:
來源:轉載
供稿:網友
開始本應該是一篇洋洋灑灑的文字, 不過我還是提倡先做起來, 在嘗試中去理解.


先試試這個:



 
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i := 0 to 500000 do
begin
Canvas.TextOut(10, 10, IntToStr(i));
end;
end;
 
 


上面程序運行時, 我們的窗體基本是 "死" 的, 可以在你在程序運行期間拖動窗體試試...

Delphi 為我們提供了一個簡單的辦法(Application.ProcessMessages)來解決這個問題:



 
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i := 0 to 500000 do
begin
Canvas.TextOut(10, 10, IntToStr(i));
Application.ProcessMessages;
end;
end;
 
 


這個 Application.ProcessMessages; 一般用在比較費時的循環中, 它會檢查并先處理消息隊列中的其他消息.

但這算不上多線程, 譬如: 運行中你拖動窗體, 循環會暫停下來...

在使用多線程以前, 讓我們先簡單修改一下程序:



 
function MyFun: Integer;
var
i: Integer;
begin
for i := 0 to 500000 do
begin
Form1.Canvas.Lock;
Form1.Canvas.TextOut(10, 10, IntToStr(i));
Form1.Canvas.Unlock;
end;
Result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
MyFun;
end;
 
 


細數上面程序的變化:
1、首先這還不是多線程的, 也會讓窗體假 "死" 一會;
2、把執行代碼寫在了一個函數里, 但這個函數不屬于 TForm1 的方法, 所以使用 Canvas 是必須冠以名稱(Form1);
3、既然是個函數, (不管是否必要)都應該有返回值;
4、使用了 500001 次 Lock 和 Unlock.

Canvas.Lock 好比在說: Canvas(繪圖表面)正忙著呢, 其他想用 Canvas 的等會;
Canvas.Unlock : 用完了, 解鎖!

在 Canvas 中使用 Lock 和 Unlock 是個好習慣, 在不使用多線程的情況下這無所謂, 但保不準哪天程序會擴展為多線程的; 我們現在學習多線程, 當然應該用.

在 Delphi 中使用多線程有兩種方法: 調用 API、使用 TThread 類; 使用 API 的代碼更簡單.



 
function MyFun(p: Pointer): Integer; stdcall;
var
i: Integer;
begin
for i := 0 to 500000 do
begin
Form1.Canvas.Lock;
Form1.Canvas.TextOut(10, 10, IntToStr(i));
Form1.Canvas.Unlock;
end;
Result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
ID: THandle;
begin
CreateThread(nil, 0, @MyFun, nil, 0, ID);
end;
 
 


代碼分析:
CreateThread 一個線程后, 算上原來的主線程, 這樣程序就有兩個線程、是標準的多線程了;
CreateThread 第三個參數是函數指針, 新線程建立后將立即執行該函數, 函數執行完畢, 系統將銷毀此線程從而結束多線程的故事.

CreateThread 要使用的函數是系統級別的, 不能是某個類(譬如: TForm1)的方法, 并且有嚴格的格式(參數、返回值)要求, 不管你暫時是不是需要都必須按格式來;
因為是系統級調用, 還要綴上 stdcall, stdcall 是協調參數順序的, 雖然這里只有一個參數沒有順序可言, 但這是使用系統函數的慣例.

CreateThread 還需要一個 var 參數來接受新建線程的 ID, 盡管暫時沒用, 但這也是格式; 其他參數以后再說吧.

這樣一個最簡單的多線程程序就出來了, 咱們再用 TThread 類實現一次



 
type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;

procedure TMyThread.Execute;
var
i: Integer;
begin
FreeOnTerminate := True; {這可以讓線程執行完畢后隨即釋放}
for i := 0 to 500000 do
begin
Form1.Canvas.Lock;
Form1.Canvas.TextOut(10, 10, IntToStr(i));
Form1.Canvas.Unlock;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
TMyThread.Create(False);
end;
 
 


TThread 類有一個抽象方法(Execute), 因而是個抽象類, 抽象類只能繼承使用, 上面是繼承為 TMyThread.

繼承 TThread 主要就是實現抽象方法 Execute(把我們的代碼寫在里面), 等我們的 TMyThread 實例化后, 首先就會執行 Execute 方法中的代碼.

按常規我們一般這樣去實例化:


 
procedure TForm1.Button1Click(Sender: TObject);
var
MyThread: TMyThread;
begin
MyThread := TMyThread.Create(False);
end;

因為 MyThread 變量在這里毫無用處(并且編譯器還有提示), 所以不如直接寫做 TMyThread.Create(False);

我們還可以輕松解決一個問題, 如果: TMyThread.Create(True) ?
這樣線程建立后就不會立即調用 Execute, 可以在需要的時候再用 Resume 方法執行線程, 譬如:



 
procedure TForm1.Button1Click(Sender: TObject);
var
MyThread: TMyThread;
begin
MyThread := TMyThread.Create(True);
MyThread.Resume;
end;

//可簡化為:
procedure TForm1.Button1Click(Sender: TObject);
begin
with TMyThread.Create(True) do Resume;
end;


使用 TThread 類時, Delphi 有提供的模板, 但用 IDE 寫代碼很方便, 我重寫一遍錄下來給大家看:



期間使用了 Ctrl+J、Shift+Ctrl+C、Ctrl+Alt+P 等快捷鍵.



重要的修正與補充:


在 TThread 類的例子中, 應該有這句: FreeOnTerminate := True; (原來漏掉, 代碼中已加上; 但動畫加不上了).

先說它什么意思:
類 Create 了就要 Free;
但 TThread(的子類) 有特殊性, 很多時候我們不能確定新建的線程什么時候執行完(也就是什么時候該釋放);
如果線程執行完畢自己知道釋放就好了, 所以 TThread 給了一個布爾屬性 FreeOnTerminate, 如果為 True, 線程執行完畢后就會自釋放.

我怎么會忽略了這么重要的問題呢? 原因有二:
1、我一直在追求最精煉的代碼;
2、我手頭上不只一本書上介紹說: FreeOnTerminate 的默認值是 True(錯誤!), 經落實, 應該是 False, 起碼在 Delphi 2007 和 2009 中是這樣; 或許以前的某個版本和現在不一樣.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产福利免费在线观看| 青草青在线视频| 免费高清视频日韩| av在线官网| 狂野欧美性猛交xxxx乱大交| 性网站在线播放| 碰草在线视频| 久热中文字幕精品视频在线| 免费看ww视频网站入口| 久久国产综合视频| 午夜免费视频在线国产| 国产人成网在线播放va免费| 国产porn在线| 男女午夜视频在线观看| 午夜视频在线观看网站午夜视频在线| 国产三级香港三韩国三级| 中文乱码字幕高清在线观看| 亚洲综合色视频在线观看| www免费在线观看视频| 国产野外战在线播放| 在线观看的av| 国产久草在线| 在线国产福利网站| 国产精品一品| 午夜在线网站| 国产第一页在线| 久热免费在线视频| 2021av在线| 国产一级片麻豆| www.国产精| 伊人永久在线| 国产精美视频| 中文字幕在线看精品乱码| 亚洲精品乱码电影在线观看| √天堂8资源中文在线| 亚洲а∨精品天堂在线| 精品视频vs精品视频| 丁香视频五月| 男女午夜视频在线观看| av文字幕在线观看| 中文一区在线观看| 国产黄大片在线观看画质优化| 久久国产精品久久久久久小说| 亚洲男人网站| 免费av在线| 激情五月色综合亚洲小说| 99热免费观看| 四虎国产精品永久| 在线国产小视频| 日本成人在线播放| 轻轻色免费在线视频| 快射av在线播放一区| 天天噜天天色| 麻豆国产视频| 中文字幕在线观看av| 国产视频二区三区| 国产福利电影在线观看| 国产福利av网站| 日本成a人片在线观看| 福利视频在线看| 国产区av在线| a视频免费看| 日本黄在线观看| 国产污视频在线| 在线播放www| 国产在线黄色片| 国产黄色片大全| 日本欧美在线视频免费观看| 老司机精品视频一区二区| 国产偷窥洗澡视频| 天天干天天操天天爽| 国产区视频在线播放| 日本福利午夜视频在线| 国产青草视频在线观看视频| 永久av在线| 国产农村av| 精精国产xxxx视频在线中文版 | 在线视频三区| 丁香花在线电影| 国产videos| jlzzjlzz欧美| 18av在线播放| 国产精品秘入口| 黄网站在线观看高清免费| 在线久久视频| 精品偷拍激情视频在线观看| 中文字幕在线免费看| 九九精品九九| www在线视频观看| 精品麻豆国产| 国产久草在线| 黄色免费av| 欧美日韩在线视频免费观看| 在线国产福利网站| 99久久99热久久精品免费看| 国产亚av手机在线观看| 久草.com| 国产精品探花在线| 激情六月婷婷| 天堂资源中文在线| 国产精品一二三区视频| 大香伊人中文字幕精品| 超碰在线网址| 国产免费视频在线| 国产专区在线播放| 六月天色婷婷| 国产麻豆一级片| 午夜视频在线观看网站午夜视频在线| 狠狠操天天操夜夜操| 丁香婷婷在线观看| 91超碰在线免费| 中文字幕日本在线观看| 国产一区二区三区美女秒播| 黄色网址在线免费播放| 中文字幕在线看精品乱码| 国产精品扒开做爽爽爽的视频| 国产视频精选在线| 精品国产二区三区| 日本视频在线| 中文字幕在线视频网| 国产对白在线| a视频免费看| 国产在线观看a| 精品欧美日韩一区二区| 女同一区二区免费aⅴ| 国产麻豆免费| 96久久久久久| 狠狠色综合久久婷婷| 国产丝袜在线| 日本电影全部在线观看网站视频| 国产美女视频一区二区三区| 国产人成在线观看| 男人天堂99| 国产99re| 欧美日韩**字幕一区| 中文字幕在线视频免费观看| 精品卡1卡2卡三卡免费网站| 高潮毛片在线观看| 在线免费黄色毛片| 国产秀色在线www免费观看| 在线三级av| 中文字幕亚洲免费| 免费观看一二区视频网站| 国产三级在线| 尤物视频在线看| 激情综合丁香| 免费视频二区| 久久综合精品视频| 日本视频二区| 亚洲激情丁香| 在线播放国产区| 国产成人va亚洲电影| 黄色片大全在线观看| 亚洲成人在线播放| 99re热视频在线| 国产三区视频在线观看| 福利资源在线久| 久久一本精品| 精品中文字幕不卡在线视频| av中文在线| 人人九九精品| 国产在线观看色| 国产免费视频| 国产一级大片| 国产日韩欧美第一页| 国产精品久久久久永久免费看| 五月婷婷视频在线观看| 国产女人在线视频| 五月天天在线| 国产精彩视频在线观看免费蜜芽| 天天av天天爱| 中文字幕免费在线视频| 最近中文字幕大全中文字幕免费| 自拍av在线| 精品推荐国产麻豆剧传媒| 精品国产免费第一区二区| 亚洲电影先锋| www在线免费观看视频| 国产乱人视频免费播放| 国产精品欧美韩国日本久久| 精品一区二区91| av在线首页| 中文字幕在线视频网| 97影院秋霞午夜在线观看| 亚洲精品天堂在线观看| wwwww亚洲| 中文字幕在线视频网| 国产精品合集一区二区| 永久免费在线观看| 国产在线高清| 一区免费观看| 国产香蕉视频在线看| 中文av在线播放| 日本中文字幕在线观看| 中文在线观看视频| 国产免费福利| 免费三级毛片| 在线伊人免费视频| 中文字幕网在线| 黄色网页网址在线免费|