新建ModuleDeclare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongSub main()
Load Form1
Form1.Show
End Sub
Public Sub c1()
.......
End SubPublic Sub c2()
......
End Sub新建窗体Private hthread1 As Long
Private hthread2 As Long
Private ithread1 As Long
Private ithread2 As LongPrivate Sub Command1_Click()ithread1 = CreateThread(ByVal 0&, ByVal 0&, AddressOf c1, ByVal 0&, ByVal 0&, hthread1) --创建线程一
ithread2 = CreateThread(ByVal 0&, ByVal 0&, AddressOf c1, ByVal 0&, ByVal 0&, hthread1) --创建线程二CloseHandle ithread1 --关闭线程一
CloseHandle ithread2 --关闭线程二End Sub
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongSub main()
Load Form1
Form1.Show
End Sub
Public Sub c1()
.......
End SubPublic Sub c2()
......
End Sub新建窗体Private hthread1 As Long
Private hthread2 As Long
Private ithread1 As Long
Private ithread2 As LongPrivate Sub Command1_Click()ithread1 = CreateThread(ByVal 0&, ByVal 0&, AddressOf c1, ByVal 0&, ByVal 0&, hthread1) --创建线程一
ithread2 = CreateThread(ByVal 0&, ByVal 0&, AddressOf c1, ByVal 0&, ByVal 0&, hthread1) --创建线程二CloseHandle ithread1 --关闭线程一
CloseHandle ithread2 --关闭线程二End Sub
解决方案 »
- 更改外部listview内容~结果却为空白~付代码~请教达人
- 想利用VB建立access数据库结构,问一问如何引用access对像
- 我又回来了,这里还有人记得我吗?为了聚集人气散200分(散分)
- 求高手帮助,数据库难题!急!!
- 关于坐标的问题,请进!
- 关于加密的初级问题
- 各位大虾请进,急啊!!!!!!!!!
- 如何使用INSTALLSHIELD安装数据库?
- 大伙快来看看这个简单的函数!!!!(为什么实现不了?)
- 简单问题,送分-------
- 在Asp中利用CreateObject调用一个Activex类型的dll,怎样释放掉?
- 在线等待!急!急!急!怎样使报表自动默认为横向打印\和A4纸张打印.谢谢
纯API多线程只能以P代码编译
最好使用ActiveX多线程
去搜索以前的贴子
最好使用ActiveX多线程
是什么回是呢?原因何在?假设我用VC写了DLL,也不可以吗?
再form里加上两个timer控件. 吧interval属性设成5000(5秒),然后在两个timer1_timer事件中放一个大loop, 如for 10000 next. 运行. 你会看到第二个timer控件不会在五秒后执行,除非timer1的for-next结束. 同样,如果你的程序中有大量的数据库读写.你的用户街面可能被"冻".这时,我们就需要用多县城来改进程序了.(当然你可以用DoEvents来避免被冻,但用DoEvents有横多副作用.这里不提).我们用的第一个API是CreateThread, VB的格式是:private declare function CreateThread Lib "kernel32" (byval pThreadAttributes as any, byval dwStackSize as long, byval lpStartAddress as long, lpParameter as any, byval dwCreationFlags as long, lpThreadID as long) as long. (从vb API text viewer中拿是最真确的语法)CreateThread的参数指出你将要创立的县城是什么样子的. CreateThread的返回值是一个县城的handle. 这里是vb的多县城初始化程序:Public Sub Initialize(lpfnBasFunc as long)
dim dwStackSize as long
dim dwCreationFlags as long
dim lpThreadId as long
dim lpParameter as long
dim myNull as long
myNull = 0& ’create a null pointer
dwStackSize = 0 ’0表示用exe stack size
dwCreationFlags = 4 ’用4表示初始化后先不激活,让别人来激活.
Me.Thread = CreateThread(myNull, dwStackSize, lpfnBasFunc, myNull, dwCreationFlags, lpThreadId)
if Me.Thread = myNull then
Msgbox "create thread failed"
end if
end Sub
下面是两个API用来激活/暂定该线程.private declare function ResumeThread lib "kernel32"(byval hThread as long)as longprivate declare function SuspendThread lib "kernel32"(byval hThread as long)as long让我们来用一个变量表示当前县城的状态.
public ThreadStatus as boolean
在vb里,可用property来实现ThreadStatus的管理.
Public property Let Enabled(byval vNewValue as boolean)
if vNewValue = true and Me.ThreadStatus = false then
ResumeThread Me.Thread
Me.ThreadStatus = True
elseif Me.ThreadStatus = true then
SuspendThread Me.Thread
Me.ThreadStatus = False
endif
end Property这个简单的类可以用New Object来引用:
’make new thread object
dim myThread as New clsThreads
’创建县城 Foo
myThread.Initialize AddressOf Foo
’激活县城
myThread.Enabled = True执行后,你可以用PVIEW95.EXE看到你的线程.
你还可以提高你的线程的优先级.
SetThreadPriority ’设优先级GetThreadPriority ’查优先级你把以上的程序加入timer例子,就会看到两个timer同时运行.
这里要提醒一下. vb的开发环境是单县城的.如果你的程序写错,或中断后试图恢复,往往会出错,有时是GPF错.总之,用vb写多线程可以写出和VC一样快的程序.而且开发容易的多,开发速度也快得多
VB不是线程安全的
但是COM、ActiveX是
就这样