vb6 如何开辟一个线程

ysxbbs 2005-06-02 11:27:15
我想实现这样一个操作 在对话框中点吉一个按钮开辟一个线程
在该线程中运行一个死循环 (不能用timer 空间来完成,因为我不希望有等待时间,如果timer设置成0,根本就不能完成我那个循环中的操作) 谢谢高手指点
...全文
487 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
evancss 2005-06-04
  • 打赏
  • 举报
回复
请参考我的文章:
http://blog.csdn.net/langkew/archive/2005/05/27/382280.aspx

使用ActiveX exe实现多线程是一种非常稳固可靠的方法.
greentest 2005-06-04
  • 打赏
  • 举报
回复
mark
ysxbbs 2005-06-04
  • 打赏
  • 举报
回复
我的问题已解决,是结贴的时候了
虽然用线程没能解决我的问题,但仍然谢谢 liyibin(为人民服务!) 谢谢你的好心,或许你的方法 以后可以用到,并且我在 《visualbasic》 实效编程百例中也找到个线程的类,如果有兴趣的话,我可以提供。
我用的进程的方法,实现起来还挺方便 谢谢 langkew(拉倒) 你的blog我无法连接,所以也没能看到,以后多到你blog中去看看。
谢谢 DooDu(杜霖:I want,I can.(MmMVP马甲)) SemYum(黄金骑士) 你们让我更加坚定的选择了进程。
ysxbbs 2005-06-04
  • 打赏
  • 举报
回复
怎么没人来呀,自己在up一下
ysxbbs 2005-06-03
  • 打赏
  • 举报
回复
我真要放弃用线程了,改用进程了! 哪位高手有进程的例子???????????
分不够我在加!!
ysxbbs 2005-06-03
  • 打赏
  • 举报
回复
to liyibin(为人民服务!) :
还是不行,我试过了,跟我编的出一样的错误
内存 .... 不能为read
hzh_net 2005-06-03
  • 打赏
  • 举报
回复
这是一个线程类模块的代码,把它保存到cThread.cls中,并在类模块属性中将其名称改为 cThread,
调用步骤:
1、定义:dim th as new cThread
2、初始化:th.Initialize AddressOf TimeProc 'TimeProc是在一个标准模块中定义的一个过程
3、[可选]设置线程的优先级:
th.Priority = THREAD_PRIORITY_NORMAL
4、启动线程:
th.Enabled = True
5、停止线程:
th.Enabled =False
6、释放线程对象:set th=nothing
!!![需特别注意]!!!
1、要编译成EXE才运行,不要在开发环境中运行!不然的话,您VB开发环境有时会崩溃!!
2、要保证您用于创建线程的过程没有错误,否则会出现“...执行了非法操作,....”
3、[VB6]在用于创建线程的过程中有一些语句不能使用,如一些绘图语句。但在VB5中却可以,不知何故...
我的意见:在.Net以下版本的VB使用多线程技术,是要冒一定风险的...
以下是类模块的代码:
Option Explicit
Option Compare Text
Option Base 0

Private Type udtThread
Handle As Long
Enabled As Boolean
End Type

Private uThread As udtThread
Private Const CREATE_SUSPENDED As Long = &H4
Public Enum THREAD_PRIORITY
THREAD_BASE_PRIORITY_IDLE = -15
THREAD_BASE_PRIORITY_LOWRT = 15
THREAD_BASE_PRIORITY_MAX = 2
THREAD_BASE_PRIORITY_MIN = -2
THREAD_PRIORITY_HIGHEST = THREAD_BASE_PRIORITY_MAX
THREAD_PRIORITY_LOWEST = THREAD_BASE_PRIORITY_MIN
THREAD_PRIORITY_ABOVE_NORMAL = (THREAD_PRIORITY_HIGHEST - 1)
THREAD_PRIORITY_BELOW_NORMAL = (THREAD_PRIORITY_LOWEST + 1)
THREAD_PRIORITY_IDLE = THREAD_BASE_PRIORITY_IDLE
THREAD_PRIORITY_NORMAL = 0
THREAD_PRIORITY_TIME_CRITICAL = THREAD_BASE_PRIORITY_LOWRT
End Enum
Private Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
Private Declare Function ResumeThread Lib "kernel32" (ByVal hThread As Long) As Long
Private Declare Function SetThreadPriority Lib "kernel32" (ByVal hThread As Long, ByVal nPriority As Long) As Long
Private Declare Function GetThreadPriority Lib "kernel32" (ByVal hThread As Long) As Long
Private Declare Function SuspendThread Lib "kernel32" (ByVal hThread As Long) As Long
Private Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
Public Sub Initialize(ByVal lpfnBasFunc As Long)

Dim lStackSize As Long, lCreationFlags As Long, lpThreadId As Long, lNull As Long

On Error Resume Next
lNull = 0
lStackSize = 0
lCreationFlags = CREATE_SUSPENDED
uThread.Handle = CreateThread(lNull, lStackSize, lpfnBasFunc, lNull, lCreationFlags, lpThreadId)
If uThread.Handle = lNull Then MsgBox "Create thread failed!"

End Sub
Public Property Get Enabled() As Boolean

On Error Resume Next
Enabled = uThread.Enabled

End Property
Public Property Let Enabled(ByVal vNewValue As Boolean)

On Error Resume Next
If vNewValue And (Not uThread.Enabled) Then
ResumeThread uThread.Handle
uThread.Enabled = True
ElseIf uThread.Enabled Then
SuspendThread uThread.Handle
uThread.Enabled = False
End If

End Property
Public Property Get Priority() As THREAD_PRIORITY

On Error Resume Next
Priority = GetThreadPriority(uThread.Handle)

End Property
Public Property Let Priority(ByVal vNewValue As THREAD_PRIORITY)

On Error Resume Next
If vNewValue = -2 Then
Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_LOWEST)
ElseIf vNewValue = -1 Then
Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_BELOW_NORMAL)
ElseIf vNewValue = 0 Then
Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_NORMAL)
ElseIf vNewValue = 1 Then
Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_ABOVE_NORMAL)
ElseIf vNewValue = 2 Then
Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_HIGHEST)
End If

End Property
Private Sub Class_Terminate()

On Error Resume Next
Call TerminateThread(uThread.Handle, 0)

End Sub

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

创建线程的api:
Private Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, LpthreadId As Long) As Long


-----------------------------------------
呵呵
^_^

therockdelt 2005-06-03
  • 打赏
  • 举报
回复
帮顶
SemYum 2005-06-02
  • 打赏
  • 举报
回复
要在循环中执行的操作写在成Active.exe,然后调用
这样VB才能实现多线程.
liyibin 2005-06-02
  • 打赏
  • 举报
回复
这是一个线程类模块的代码,把它保存到cThread.cls中,并在类模块属性中将其名称改为 cThread,
调用步骤:
1、定义:dim th as new cThread
2、初始化:th.Initialize AddressOf TimeProc 'TimeProc是在一个标准模块中定义的一个过程
3、[可选]设置线程的优先级:
th.Priority = THREAD_PRIORITY_NORMAL
4、启动线程:
th.Enabled = True
5、停止线程:
th.Enabled =False
6、释放线程对象:set th=nothing
!!![需特别注意]!!!
1、要编译成EXE才运行,不要在开发环境中运行!不然的话,您VB开发环境有时会崩溃!!
2、要保证您用于创建线程的过程没有错误,否则会出现“...执行了非法操作,....”
3、[VB6]在用于创建线程的过程中有一些语句不能使用,如一些绘图语句。但在VB5中却可以,不知何故...
我的意见:在.Net以下版本的VB使用多线程技术,是要冒一定风险的...
以下是类模块的代码:
Option Explicit
Option Compare Text
Option Base 0

Private Type udtThread
Handle As Long
Enabled As Boolean
End Type

Private uThread As udtThread
Private Const CREATE_SUSPENDED As Long = &H4
Public Enum THREAD_PRIORITY
THREAD_BASE_PRIORITY_IDLE = -15
THREAD_BASE_PRIORITY_LOWRT = 15
THREAD_BASE_PRIORITY_MAX = 2
THREAD_BASE_PRIORITY_MIN = -2
THREAD_PRIORITY_HIGHEST = THREAD_BASE_PRIORITY_MAX
THREAD_PRIORITY_LOWEST = THREAD_BASE_PRIORITY_MIN
THREAD_PRIORITY_ABOVE_NORMAL = (THREAD_PRIORITY_HIGHEST - 1)
THREAD_PRIORITY_BELOW_NORMAL = (THREAD_PRIORITY_LOWEST + 1)
THREAD_PRIORITY_IDLE = THREAD_BASE_PRIORITY_IDLE
THREAD_PRIORITY_NORMAL = 0
THREAD_PRIORITY_TIME_CRITICAL = THREAD_BASE_PRIORITY_LOWRT
End Enum
Private Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
Private Declare Function ResumeThread Lib "kernel32" (ByVal hThread As Long) As Long
Private Declare Function SetThreadPriority Lib "kernel32" (ByVal hThread As Long, ByVal nPriority As Long) As Long
Private Declare Function GetThreadPriority Lib "kernel32" (ByVal hThread As Long) As Long
Private Declare Function SuspendThread Lib "kernel32" (ByVal hThread As Long) As Long
Private Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
Public Sub Initialize(ByVal lpfnBasFunc As Long)

Dim lStackSize As Long, lCreationFlags As Long, lpThreadId As Long, lNull As Long

On Error Resume Next
lNull = 0
lStackSize = 0
lCreationFlags = CREATE_SUSPENDED
uThread.Handle = CreateThread(lNull, lStackSize, lpfnBasFunc, lNull, lCreationFlags, lpThreadId)
If uThread.Handle = lNull Then MsgBox "Create thread failed!"

End Sub
Public Property Get Enabled() As Boolean

On Error Resume Next
Enabled = uThread.Enabled

End Property
Public Property Let Enabled(ByVal vNewValue As Boolean)

On Error Resume Next
If vNewValue And (Not uThread.Enabled) Then
ResumeThread uThread.Handle
uThread.Enabled = True
ElseIf uThread.Enabled Then
SuspendThread uThread.Handle
uThread.Enabled = False
End If

End Property
Public Property Get Priority() As THREAD_PRIORITY

On Error Resume Next
Priority = GetThreadPriority(uThread.Handle)

End Property
Public Property Let Priority(ByVal vNewValue As THREAD_PRIORITY)

On Error Resume Next
If vNewValue = -2 Then
Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_LOWEST)
ElseIf vNewValue = -1 Then
Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_BELOW_NORMAL)
ElseIf vNewValue = 0 Then
Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_NORMAL)
ElseIf vNewValue = 1 Then
Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_ABOVE_NORMAL)
ElseIf vNewValue = 2 Then
Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_HIGHEST)
End If

End Property
Private Sub Class_Terminate()

On Error Resume Next
Call TerminateThread(uThread.Handle, 0)

End Sub

ysxbbs 2005-06-02
  • 打赏
  • 举报
回复
to : supergreenbean(超级绿豆 - 要准备发芽了)

刚改过试了,用p代码方式会出现两处错误, Native code 出现一处错误,还是不行 不知为什么
F5或Ctrl+F5都能正常运行!!! 本人很急,哪位高手过来指点,我第一次用vb,但我做的一个访问数据库东西别人给得说明书函数 全部是vb的,所以不得不用vb
本人就是要处理一个简单的死循环,我上网查了很多有人说用进程,有人说用线程,怎样也好希望高手给出个例子 在此谢过了
唐古拉山 2005-06-02
  • 打赏
  • 举报
回复

呵呵 是的啊 我这有个多线程的程序  IDE 状态很好,编译后执行立即崩溃

 VB啊 为什么就不争气


supergreenbean 2005-06-02
  • 打赏
  • 举报
回复
编译的时候选择 P代码 方式
ysxbbs 2005-06-02
  • 打赏
  • 举报
回复
怎么没人回答?
我刚用CreateThread 编写了一个线程,但是用F5或Ctrl+F45都能正常运行
用vb生成的exe文件就会出错?
本人很急,再次请高手帮忙,用进程也行!!!
昨晚这个东西,我在也不用vb了
ysxbbs 2005-06-02
  • 打赏
  • 举报
回复
有没有人给个例子, 我对vb不熟 ,本人急用,谢谢
ysxbbs 2005-06-02
  • 打赏
  • 举报
回复
就简单得开一个线程,不用跟跟主线程交换数据!
DooDu 2005-06-02
  • 打赏
  • 举报
回复
创建线程的api:
Private Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, LpthreadId As Long) As Long

vb多线程天生孱弱(调试过程中经常无故退出),放弃吧~我就用的多进程,DDE通讯。

7,765

社区成员

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

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