當前位置:編程學習大全網 - 編程語言 - vb中的timer\多線程有關問題

vb中的timer\多線程有關問題

我認為妳有幾點誤區:

1;壹個程序並不是占用系統資源越多,就運行得越快。程序要實現同壹項功能,妳的代碼讓CPU的工作量越少,系統資源占用越小,說明妳的代碼效率越高,程序運行速度越快。另外,CPU當前執行的線程越少,它就會有更多的資源為妳需要的程序服務,因此妳的程序速度也會提高。

2:1 ms 內運行多少代碼? 這樣說也不完全對。 CPU執行的是代碼編譯成的機器指令。它只認識 1 和 0 ,我們講的CPU主頻和CPU的運算速度是有壹定關系的。工作在100MHz主頻的CPU執行壹條運算指令所需時間僅為10ns。再者,線程的優先級也會對運行速度有壹定影響,但感覺不是很明顯。

3:關於VB多線程的實現,給妳壹個網上不錯的實例。

'請將該部分數據保存為 FORM1.frm 文件

VERSION 5.00

Begin VB.Form Form1

Caption = "多線程"

ClientHeight = 3195

ClientLeft = 60

ClientTop = 345

ClientWidth = 6450

LinkTopic = "Form1"

ScaleHeight = 3195

ScaleWidth = 6450

StartUpPosition = 3 '窗口缺省

Begin VB.TextBox Text1

Height = 270

Left = 960

TabIndex = 2

Text = "2"

Top = 2760

Width = 2415

End

Begin VB.CommandButton Command2

Caption = "返回"

Height = 255

Left = 3480

TabIndex = 1

Top = 2760

Width = 1455

End

Begin VB.CommandButton Command1

Caption = "Start Count"

Height = 255

Left = 3480

TabIndex = 0

Top = 240

Width = 1455

End

Begin VB.Label Label1

AutoSize = -1 'True

Caption = "主線程執行結果測試:"

Height = 180

Left = 600

TabIndex = 3

Top = 2400

Width = 1710

End

End

Attribute VB_Name = "Form1"

Attribute VB_GlobalNameSpace = False

Attribute VB_Creatable = False

Attribute VB_PredeclaredId = True

Attribute VB_Exposed = False

Private Sub Command1_Click()

'聲明了線程ID

Dim threadid1 As Long

Dim threadid2 As Long

'參數壹,lpThreadAttributes 線程安全屬性,傳遞為NULL

'參數二,dwStackSize ,線程堆棧大小,可以為0,表示堆棧和此應用堆棧相同

'參數三,lpstartAddress ,執行函數地址,用AddressOf 獲取

'參數四,lpParameter ,執行函數的參數地址,可以是壹個記錄或者是別的類型,用VarPtr獲取參數地址(varptr為未公開函數)!!

'參數五,dwCreationFlags ,表示線程創建後的狀態!,0表示立即運行,create_SUSPENDED表示線程掛起

'參數六,lpThreadID 表示分配給線程的線程號

Call CreateThread(Null, ByVal O&, AddressOf Module1.OutText1, VarPtr(0), ByVal 0&, threadid1)

Call CreateThread(Null, ByVal 0&, AddressOf Module1.OutText2, VarPtr(0), ByVal 0&, threadid2)

End Sub

Private Sub Command2_Click()

'該事件運行於主線程!

Dim i As Long

i = CLng(Text1.Text)

Text1.Text = CStr(i * i) '不要點擊次數太多,LONG 類型會溢出

End Sub

Private Sub Form_Load()

'保存窗體句柄全局變量,用於在form 上繪圖

formhandle = Form1.hwnd

End Sub

----------------------------------

'請將該部分數據保存為 Module1.bas 文件

Attribute VB_Name = "Module1"

'線程安全屬性數據結構;

Public Type SECURITY_ATTRIBUTES

nLength As Long

lpSecurityDescriptor As Long

bInheritHandle As Long

End Type

'這個是用於多線程訪問臨界資源同步Api的數據結構

Public Type CRITICAL_SECTION

dummy As Long

End Type

'為什麽用GDI 函數繪圖?原因等下再講

Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

Public Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long

Public Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long

Public Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long

'請註意;createThread APi聲明已被我修改過,修改的地方請自行參照APIView復制的內容

Public 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

'這個是sleep,作用就是讓兩個線程繪圖頻率不壹致,效果才明顯。

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Public Declare Sub EnterCriticalSection Lib "kernel32" (lpCriticalSection As CRITICAL_SECTION) '進入臨界區

Public Declare Sub LeaveCriticalSection Lib "kernel32" (lpCriticalSection As CRITICAL_SECTION) '離開臨界區

'幾個重要的函數舉例

'ObjPtr:返回對象實例私有域的地址。

'StrPtr:返回字符串第壹個字的地址。

'VarPtr:返回變量的地址。

'全局的form的句柄!

Public formhandle As Long

'臨界數據結構

Public sect As CRITICAL_SECTION

Sub OutText1() '過程壹

Dim i As Long

Dim dc As Long

Dim s As String

dc = GetDC(formhandle) '獲取窗體句柄的DC

For i = 1 To 100000

s = CStr(i)

Call SetBkColor(dc, &HF0F0F0) '設置繪制區域的背景色,也起清除作用

Call TextOut(dc, 10, 10, s, Len(s)) '輸出文本!

Call Sleep(40) '等待

Next

Call ReleaseDC(formhandle, dc) '釋放資源!

' Call EnterCriticalSection(sect)

' 上下表示該處為臨界區,如果要對工程全局變量做操作,最好在該區域內

' 否則線程同步過程中,非常容易讓程序崩潰

' Call LeaveCriticalSection(sect)

End Sub

Sub OutText2() '和過程壹類似

Dim i As Long

Dim dc As Long

Dim s As String

dc = GetDC(formhandle)

For i = 1 To 100000

s = CStr(i)

Call SetBkColor(dc, &HF0F0F0)

Call TextOut(dc, 10, 80, s, Len(s)) '文本位置改變了

Call Sleep(20) '延時改變了

Next

Call ReleaseDC(formhandle, dc)

' Call EnterCriticalSection(sect)

' Call LeaveCriticalSection(sect)

End Sub

'關於為何使用gdi 函數輸出文本,這是壹個很重要的內容;

'程序在記數時用了難用的TextOut 函數,而沒有使用標簽控件,這是因為

'vb的組件不都是線程安全的,當多線程訪問不是線程安全的組件,那麽會

'產生嚴重錯誤。

  • 上一篇:貴州有什麽專業的技校
  • 下一篇:廣東科學中心有哪8個館?
  • copyright 2024編程學習大全網