VB無所不能之七:VB的多線程(1)
作者:鐘聲
題外話: 最近,寫了幾篇《VB無所不能》系列,本系列文章的創作初衷就是要去顛覆眾多程式員對於“非物件導向”語言“VB”的成見! 當然,我也早有預期,此言一出必然招致不明真相的群眾的“圍攻”,然而,我還是要繼續寫下去,事實勝於雄辯,在這裡我也想和廣大網友說一聲,如果要質疑我文章中的某些觀點,歡迎拿出真憑實據與我辯論,切莫採取
“五毛黨”式的語言
橫加棒殺。
再次聲明關於“無所不能”: 本文系列為《VB無所不能》,並不是真的像孫悟空72變似的“無所不能”,想變一個蚊子變個蚊子,想變個大象變個大象,吃喝拉撒睡全用VB給你解決了那是不可能的,關於“VB是否無所不能”這個話題就不用再跟我爭論了,任何語言都不能“無所不能”,這裡的“無所不能”是一個“狀語”,而不是“定語”,OK? 好,我們繼續,最近有網友強烈要求我寫一篇關於VB多線程的文章,我在部落格的留言中大呼“頭疼”!! 是啊,VB確實處理多線程是一個頭疼的事情,比VB處理影像處理,鉤子程式,和指標要頭疼很多。頭疼之處無非有如下幾點: 1、VB本身沒有多線程的處理機制2、VB的大部分控制項都不是安全執行緒的3、動不動就莫名其妙的因為嚴重錯誤而程式崩潰 但,還是為了滿足網友要求,我還是硬著頭皮寫一篇,如有不對之處,還請大家見笑了!!
一、首先我們來認識一下Windows的kernel32給我們提供的線程函數
CreateThread
說明:微軟在Windows API中提供了建立新的線程的函數CreateThread
概述:
當使用CreateProcess調用時,系統將建立一個進程和一個主線程。CreateThread將在主線程的基礎上建立一個新線程,大致做如下步驟:
1.在核心對象中分配一個線程標識/控制代碼,可供管理,由CreateThread返回
2.把線程退出碼置為STILL_ACTIVE,把線程掛起計數置1
3.分配context結構
4.分配兩頁的實體儲存體以準備棧,保護頁設定為PAGE_READWRITE,第2頁設為PAGE_GUARD
5.lpStartAddr和lpvThread值被放在棧頂,使它們成為傳送給StartOfThread的參數
6.把context結構的棧指標指向棧頂(第5步)指令指標指向startOfThread函數
VB函式宣告:Declare Function CreateThread Lib "kernel32" (_lpThreadAttributes As Any, _ByVal dwStackSize As Long, _ByVal lpStartAddress As Long, _ByVal lpParameter As Long, _ByVal dwCreationFlags As Long, _lpThreadId As Long) As Long
參數說明:
lpThreadAttributes:指向SECURITY_ATTRIBUTES型態的結構的指標。在Windows 98中忽略該參數。在Windows NT中,它被設為NULL,表示使用預設值。
dwStackSize:線程堆棧大小,一般=0,在任何情況下,Windows根據需要動態延長堆棧的大小。
lpStartAddress:指向線程函數的指標,形式:@函數名,函數名稱沒有限制,但是必須以下列形式聲明:DWORD WINAPI ThreadProc (LPVOID pParam) ,格式不正確將無法調用成功。
lpParameter:向線程函數傳遞的參數,是一個指向結構的指標,不需傳遞參數時,為NULL。
dwCreationFlags:線程標誌,可取值如下
CREATE_SUSPENDED: 建立一個掛起的線程
0 :建立後立即啟用。
lpThreadId:儲存新線程的id。
傳回值:
函數成功,返回線程控制代碼;函數失敗返回false。
函數說明:
建立一個線程。
Sleep
VB聲明:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
調用:
Sleep 3000 '延時3秒執行'這個是sleep,作用就是讓兩個線程繪圖頻率不一致,效果才明顯。
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 好,今天我們認識了這兩個函數,今天先寫到這,明天我們給出常式,看看VB是如何利用這些函數完成多線程任務的吧。。
'''
鐘聲寫的關於Java方面的書:
《Java程式員,上班那點事兒》:
前言,
目錄
卓越網銷售連結
China-pub銷售連結
噹噹網銷售連結
《Java程式員,上班那點事》紀念帖
關於下載《Java程式員,上班那點事兒》的電子版