亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

c# 多線程編程 入門篇

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


先試試這個:



 
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; 一般用在比較費時的循環(huán)中, 它會檢查并先處理消息隊列中的其他消息.

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

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



 
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;
 
 


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

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

在 Canvas 中使用 Lock 和 Unlock 是個好習(xí)慣, 在不使用多線程的情況下這無所謂, 但保不準(zhǔn)哪天程序會擴展為多線程的; 我們現(xiàn)在學(xué)習(xí)多線程, 當(dāng)然應(yīng)該用.

在 Delphi 中使用多線程有兩種方法: 調(diào)用 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 一個線程后, 算上原來的主線程, 這樣程序就有兩個線程、是標(biāo)準(zhǔn)的多線程了;
CreateThread 第三個參數(shù)是函數(shù)指針, 新線程建立后將立即執(zhí)行該函數(shù), 函數(shù)執(zhí)行完畢, 系統(tǒng)將銷毀此線程從而結(jié)束多線程的故事.

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

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

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



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

procedure TMyThread.Execute;
var
i: Integer;
begin
FreeOnTerminate := True; {這可以讓線程執(zhí)行完畢后隨即釋放}
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 主要就是實現(xiàn)抽象方法 Execute(把我們的代碼寫在里面), 等我們的 TMyThread 實例化后, 首先就會執(zhí)行 Execute 方法中的代碼.

按常規(guī)我們一般這樣去實例化:


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

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

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



 
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 類的例子中, 應(yīng)該有這句: FreeOnTerminate := True; (原來漏掉, 代碼中已加上; 但動畫加不上了).

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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
日韩视频在线一区二区| 精品乱码一区内射人妻无码| 粉嫩aⅴ一区二区三区四区| 国产精品白浆一区二小说| 欧美97人人模人人爽人人喊视频| h色视频在线观看| 丝袜美腿综合| av资源在线看片| 免费观看h片| 成人午夜碰碰视频| 九色资源网91| 日韩久久久久久久久久久| 国产视频一区二区三区在线观看| 久久综合伊人77777尤物| 中文综合在线观看| 大陆精大陆国产国语精品| 户外露出一区二区三区| 亚洲一区二区国产| www毛片com| 亚洲自拍偷拍在线| 桃花岛tv亚洲品质| 成人av网址在线观看| 国产乱人伦偷精品视频免下载| 中文精品久久久久人妻不卡| 久久久天堂国产精品| 欧美1区免费| 在线免费av一区| 色综合久久88色综合天天| 不卡一区二区三区四区五区| 丝袜美女写真福利视频| 日韩欧美高清在线视频| jizz在线视频| 日韩西西人体444www| 国产超级va在线视频| 国产精品视频| 亚洲欧洲偷拍精品| 99蜜桃在线观看免费视频网站| 久久精品成人av| bdsm在线观看播放视频| 在线碰免费视频在线观看| 亚洲黄色小说网站| 日韩欧美国产黄色| 国产一级一级国产| 不卡视频在线| 免费永久网站黄欧美| 亚洲美女少妇无套啪啪呻吟| 国产美女久久久久久| 少妇精品无码一区二区三区| 精品中文字幕一区二区| 亚洲精品国产首次亮相| 亚洲精品v天堂中文字幕| 夜先锋av资源| 国产精品99re| 视频一区视频二区视频三区视频四区国产| 少妇高潮一区二区三区99小说| 成人一级片免费看| 久久福利一区| 国产成人免费91av在线| heyzo国产| 超碰超碰在线观看| 性无码专区无码| 精品va天堂亚洲国产| 亚洲va欧美va人人爽成人影院| 精品人妻无码一区二区三区蜜桃一| 五月花丁香婷婷| 美女视频一区二区三区| 国产精品久久久久久久久久久久久久久久久| 免费看日b视频| 久草热在线观看| 日本精品在线播放| 久久久久久久久久久网站| 欧美高清视频| 美女91精品| wwwav91com| 日本在线观看中文字幕| 亚州欧美一区三区三区在线| 在线观看视频一区| 欧美激情一区二区在线| 亚州国产精品视频| 91午夜伦伦电影理论片| 国产精品欧美亚洲777777| 国产偷国产偷亚洲高清人白洁| 91资源在线播放| 国产精品毛片va一区二区三区| 国产成人免费91av在线| 97av自拍| 日韩久久久久久久| 麻豆tv在线播放| 欧美一级电影免费在线观看| 久久久国产精品入口麻豆| 国产三级欧美三级日产三级99| 国产精品亲子伦av一区二区三区| 亚洲最大成人在线| 色狠狠久久av五月综合| 亚洲精品免费播放| 在线成人综合色一区| 欧美久久香蕉| 国产经品一区二区| 国产精品白嫩美女在线观看| 亚洲国产视频a| 亚洲色图18p| 永久免费的av网站| 日本中文字幕久久看| 在线看片日韩| 免费观看日韩毛片| 韩国成人动漫| 500福利第一精品导航| 91在线看国产| 免费久久99精品国产自| 中文字幕在线日亚洲9| 天天操天天摸天天干| 成人av影视| 97视频免费在线观看| 国产激情自拍视频| 另类少妇人与禽zozz0性伦| 国产精品无码无卡无需播放器| 亚洲图片小说视频| 日批视频在线免费看| 灌醉mj刚成年的大学平面模特| 奇米影视一区二区三区| 久久在线免费| 久久久亚洲精品石原莉奈| 中文字幕在线看| 亚洲三区四区| 久久青草伊人| 污污免费网站| 欧日韩免费视频| 欧美videos粗暴高清性| 色欧美片视频在线观看在线视频| 福利小视频在线| 日韩综合一区| 福利片在线观看| 一区二区三区在线高清| 国产成人a亚洲精品| 欧美白人最猛性xxxxx69交| 色综合天天综合狠狠| 亚洲电影中文字幕| 欧美—级在线免费片| 开心快乐六月丁香婷婷| 国产精品毛片一区二区在线看舒淇| 久久国产精品影院| 国产91精品久久久久久久网曝门| 国产亚洲一区二区三区不卡| 日韩限制级电影在线观看| 95精品视频| 免费观看中文字幕| 一级日韩一区在线观看| 国产日韩一区二区三区| av免费网站在线观看| 国产中文一区二区三区| 国产日韩一区欧美| 欧美黄色小视频| 欧美—级a级欧美特级ar全黄| 在线视频欧美日韩| 日本一区二区三区视频| 欧美videofree性高清杂交| 一级欧美视频| а√中文在线天堂精品| 亚洲精品国产一区二区三区四区在线| 99精品视频在线观看免费| 国产精品一二三视频| 国产激情一区二区三区四区| 日本免费不卡一区二区| 久久成人av网站| 全部免费毛片在线播放网站| 妺妺窝人体色www在线小说| 国产一区二区三区四区尤物| 国产中文字幕av| 亚洲人成伊人成综合网久久久| 亚洲成人激情在线观看| 五月婷婷久久丁香| 欧美亚洲综合视频| 高潮久久久久久久久久久久久久| 国产中文字幕免费| 亚洲视频网在线直播| 中文字幕一区二区三区精品| 国产寡妇亲子伦一区二区| 国产黄网在线观看| 在线免费av导航| 国产经品一区二区| 亚洲色图插插| 九色视频在线观看免费播放| 国产欧美视频在线| 午夜欧美不卡精品aaaaa| 午夜精品久久久久久久99黑人| 久久久久久久久久久99| 久久久久无码国产精品| 亚洲欧美色图区| 精品国产一区二区三区麻豆免费观看完整版| 禁久久精品乱码| 91国语精品自产拍在线观看性色| 丝袜av一区| 国产精品10p综合二区| 国产传媒久久久| 91av视频| 欧美成人激情图片网| 91极品尤物在线播放国产| 影视先锋午夜av| 国产精品扒开腿做爽爽爽男男| 可以免费看av的网址| av网址在线免费观看| 久草热久草在线频| 欧美日韩中文字幕| 一区二区三区av| 精品一二三四区| 日韩一级中文字幕| 国产一区二区毛片| 成人国产精品毛片| 裸体武打性艳史| 福利网址在线观看| 久久免费精品一区二区| 国模私拍视频在线| 亚洲美女主播视频免费观看| 成入视频在线观看| 全彩无遮拦全彩口工漫画全彩| 99精品欧美一区二区三区综合在线| 亚洲欧洲在线免费| 天堂中文资源在线观看| av片免费观看| 久久精品一区二区三| 国产精品区二区三区日本| 国产一区二区在线观看视频| 成人手机视频在线| 国产精品电影院| 日韩二区三区| 日韩熟女一区二区| 98精品国产自产在线观看| 欧美激情 亚洲| 色综合视频一区二区三区高清| 亚洲欧美日韩成人在线| 精品国产一级| 好看不卡的中文字幕| 亚洲一区在线日韩在线深爱| www.亚洲天堂| 六月激情综合网| 色久综合一二码| 三级黄在线播放| 青青青爽在线视频免费观看| 日日骚.com| 国产欧美日韩综合一区在线播放| 日韩一区二区在线免费观看| 亚洲国产高清av| 亚洲mv在线观看| 欧美久久高跟鞋激| 最近中文字幕在线视频| www.天天射.com| 中文字幕制服丝袜成人av| 国产精品99久久久久久似苏梦涵| 欧美一区永久视频免费观看| 国产a视频精品免费观看| 国产精品国内免费一区二区三区| 欧美最猛黑人xxxx黑人猛交黄| 国产69精品久久777的优势| 激情欧美一区二区三区中文字幕| 国产又爽又黄无码无遮挡在线观看| 日韩免费电影网站| 日韩在线观看免费高清| 国产精品无码专区av免费播放| 操bbb操bbb| 国产又黄又嫩又滑又白| 国产一区二区无遮挡| 欧美激情一级精品国产| 精品国产乱码久久久久久樱花| 91影院在线免费观看| 综合久久给合久久狠狠狠97色| 中文字幕欧美日本乱码一线二线| 日韩综合小视频| 亚洲人妻一区二区| 亚洲人精选亚洲人成在线| 久久久久久久久一| 亚洲天堂第一页| 亚洲乱码一区二区三区| 日本精品久久久| 色爱综合网欧美| 国产欧美日产一区| 麻豆传媒在线视频| 中文字幕99| 欧美伊久线香蕉线新在线| 日韩精品一区二区亚洲av性色| 国产精品一区在线免费观看| 99久久夜色精品国产网站| 免费不卡av在线| 国产福利小视频| 在线观看av中文字幕| 欧美黑人视频一区| 免费wwwxxx| 中国黄色录像片| 日韩 欧美 亚洲| 成人三级视频在线观看一区二区| 国产粉嫩一区二区三区在线观看| 青青草在线播放| 天天好比中文综合网| 五月久久久综合一区二区小说| 伊人网伊人影院| av在线播放网址| 日本黄色免费在线| 狠狠色丁香久久婷婷综| 日韩经典一区二区三区| 五十路在线观看| 欧美精品电影在线| 小处雏高清一区二区三区| 日本欧美一区二区在线观看| 久久精品国产68国产精品亚洲| 中文字幕日韩av| bbw在线视频| 性一交一乱一区二区洋洋av| 精品伊人久久久| 日本最新高清不卡中文字幕| 亚洲国产av一区| 欧美18—19性高清hd4k| 久久riav| 中文字幕欧美一区二区| 三级三级久久三级久久18| 老子影院午夜伦不卡大全| 丰满少妇高潮在线观看| 在线观看成人免费视频| 日韩在线不卡av| 久久天堂成人| 成人高清网站| chinesegaysextube| 亚洲精品理论片| 天天操中文字幕视频| av电影一区| 午夜精品久久久久久久久久蜜桃| 天天摸天天做天天爽水多| 一区在线免费观看| 国产黄色精品视频| 色一情一乱一乱一91av|