vb的多线程如何实现?

ztchen 2001-11-30 02:04:12
我调用了CreateThread函数,但执行后总出错,实在是摸不着头脑,请各位高手指点,谢谢!
...全文
133 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cuiyxy 2001-12-06
  • 打赏
  • 举报
回复
设置:
工程属性-->编译-->编译成 P代码

程序退出时调用TerminateThread

声明如下:
Public Declare Function TerminateThread Lib "kernel32" Alias "TerminateThread" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
ztchen 2001-12-05
  • 打赏
  • 举报
回复
没有人回答吗?
ztchen 2001-12-02
  • 打赏
  • 举报
回复
请问,
Me.Thread = CreateThread(myNull, dwStackSize, lpfnBasFunc, myNull, dwCreationFlags, lpThreadId)
这行代码中的Me.Thread是哪里来的?另外,线程调用过程在哪里?
gmc007 2001-12-02
  • 打赏
  • 举报
回复
帮我看看
http://www.csdn.net/expert/topic/399/399534.shtm
dsclub 2001-12-02
  • 打赏
  • 举报
回复
帮忙进一下“帮忙讲一下 FindText、 ReplaceText”
谢谢
ztchen 2001-12-02
  • 打赏
  • 举报
回复
Can anybody help me?
DeityFox 2001-12-01
  • 打赏
  • 举报
回复
试试下面的例子

黑经:怎样用vb写多线程.



Posted by darkside on August 04, 1998 at 15:37:13:


尽管vb5是apprent single-thread(单线程)的.但用addressof加上一些API,就可以非常容易的做多线程.(比VC容易的多,做出来的东西也一样快,因为都是用API). 每一个县城(线程,下同)约占用20毫秒的时间片.

vb5有一个主线程.我们可以另外加一个工作线程.对于不清楚什么是单/多线程的程序元,我们用一个简单的列子来说明一下.
再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同时运行.
这里要提醒一下. vb5的开发环境是单县城的.如果你的程序写错,或中断后试图恢复,往往会出错,有时是GPF错.
总之,用vb写多线程可以写出和VC一样快的程序.而且开发容易的多,开发速度也快得多.

ztchen 2001-12-01
  • 打赏
  • 举报
回复
你写的行吗?我看了很多网上所谓的CreateThread示例代码,我的和他们一样,完全没有错啊,但就要出错。并且同样的API函数调用,我在VC里就很好用,可以任意创建线程。
hdj0569 2001-11-30
  • 打赏
  • 举报
回复
你写的能运行吗?
ztchen 2001-11-30
  • 打赏
  • 举报
回复
我看了很多网上得源码,和我的方法一样,但我得程序就是内存读写错误,这到底是怎么回事啊?
cloud_soft 2001-11-30
  • 打赏
  • 举报
回复
vb6不支持真正的多线程!但可以模拟的。网上有很多源码,自己研究吧。建议用vc进行多线程编程,要简单的多。
sssa2000 2001-11-30
  • 打赏
  • 举报
回复
换一个把,别用vb编多线程的东西,这样会比较麻烦

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧