VB無所不能之七:VB的多線程(1)

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是如何利用這些函數完成多線程任務的吧。。
 
鐘聲寫的書:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章