VB 6.0 多线程安全退出问题

tianliang09 2011-04-14 04:45:56
以下是转载的:
*************************************************************************************************
1 若要终止线程的运行,可以使用下面四种的方法:
一、线程函数退出循环来返回 (最佳方法 )。
二、通过调用ExitThread 函数,线程将自行撤消(尽量不要使用这种方法 )。
三、同一个进程或另一个进程中的线程调用TerminateThread 函数(最好避免使用这种方法 )。
四、该线程的主进程终止运行(避免使用 )。
下面将介绍终止线程运行的方法,并且说明线程终止运行时会出现什么情况。
1.1 线程函数返回
始终都应该将线程设计成这样的形式,即当想要线程终止运行时,它们就能够返回。这是
确保所有线程资源被正确地清除的唯一办法。
如果线程能够返回,就可以确保下列事项的实现:
1. 在线程函数中创建的所有C + +对象均将通过它们的撤消函数正确地撤消。
2. 操作系统将正确地释放线程堆栈使用的内存。
3. 系统将线程的退出代码(在线程的内核对象中维护)设置为线程函数的返回值。
4. 系统将递减线程内核对象的使用计数。
*************************************************************************************************
针对方法一请问谁有这方面的例子?或有其它关于多线程安全退出的解决办法,感激不尽!请教各位好汉不吝赐教!!!
...全文
1280 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
pch18 2011-05-29
  • 打赏
  • 举报
回复
是用P代码 编译的
pch18 2011-05-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 supermanking 的回复:]
弄个范例大家看看:
1、先建立一个窗口,并向窗口中添加两个CommandButton控件和一个Label控件
2、修改Command1的Caption为“开始线程”
3、修改Command2的Caption为“停止线程”
窗口代码如下:

VB code

Private Declare Function CreateThread Lib "kernel32" (lpThreadA……
[/Quote]



调试可以,为什么编译成EXE 却没反应了啊??
pch18 2011-05-29
  • 打赏
  • 举报
回复
为什么编译成EXE 却没反应了啊??
dbcontrols 2011-04-26
  • 打赏
  • 举报
回复
SupermanKing辛苦了
很佩服
现在还是人类 2011-04-26
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 veron_04 的回复:]
实现了,但不稳定。。。。
很容易崩溃,特别是在IDE环境下是OK的,但一旦编译成EXE再运行就容易崩溃了,不管是用什么编译方式。我不知道原因何在。。。
而且多线程编程,有很多VB函数不能用,会引起崩溃。
[/Quote]
因为VB有自己的解释器进行单元线程管理,如果直接用API的线程,就不在VB的管理范围之内,
所以运行速度和资源控制会有一些冲突,导致在API线程中部分VB函数或语句调用出错。
如果要在VB中使用多线程,要注意开发理念要按 Win32 SDK 的方式开发,不要老想着用 VB
的习惯去操作,这样很容易出问题,因为一旦开启了 API 线程,整个线程函数的解释过程就会
被 Win32 子系统直接接管,而不是经过 VB 解释器所处理后再到 Win32 子系统,这样一来
就和很多 VB 的概念冲突,当然对于 VB 开发者来说,这种开发方式也很容易引起错误。
所以,我曾经才说在 VB 里弄多线程还不如直接在 VC 里操作简单。至于不稳定,多半就是在
线程函数处理上很多时候还是用VB的概念处理才会导致这类现象,如果理解到了这个线程不是在
VB解释器里运行,而是直接在 Win32 子系统上运行,那么运行速度、资源和内存的控制都是在
另一个层面的,这样相信问题也不会出那么多了,可以这么说,VB多线程里的过程,在某种意义
上来说,应该接近于 VC 的速度,但因为还是避免不了运用 VB 的语句或函数什么的,所以要慢
过 VC 的速度,不过和 VB 主线程相比,这种多线程要比主线程运行效率高。
贝隆 2011-04-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 supermanking 的回复:]
引用 1 楼 veron_04 的回复:
VB多线程,网上有很多所谓的多线程,我试验过,都没有成功。也许是我能力不够,但我仍然固执的认为VB6.0是不能做多线程的。

VB是可以实现多线程的,这个是一定的,只是在做具体代码的时候需要注意些问题才能正常,
而且编译要P代码。还有就是不要以调试为准,以编译为准。
[/Quote]
实现了,但不稳定。。。。
很容易崩溃,特别是在IDE环境下是OK的,但一旦编译成EXE再运行就容易崩溃了,不管是用什么编译方式。我不知道原因何在。。。
而且多线程编程,有很多VB函数不能用,会引起崩溃。
贝隆 2011-04-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 supermanking 的回复:]
引用 11 楼 veron_04 的回复:
实现了,但不稳定。。。。
很容易崩溃,特别是在IDE环境下是OK的,但一旦编译成EXE再运行就容易崩溃了,不管是用什么编译方式。我不知道原因何在。。。
而且多线程编程,有很多VB函数不能用,会引起崩溃。

因为VB有自己的解释器进行单元线程管理,如果直接用API的线程,就不在VB的管理范围之内,
所以运行速度和资源控制会有一些冲突,导致在AP……
[/Quote]
受教!
看来只有偏执狂会选择用VB实现多线程了。呵呵。
也许去学习一门新的语言来写多线程程序都比研究VB实现多线程来得快。。。
现在还是人类 2011-04-16
  • 打赏
  • 举报
回复
其实大家注意一下我的程序,里面有个Sleep,可以尝试一下不要这句,你将会发现
VB会出问题,如果加入更多的过程到线程的过程,你会发现Sleep的停顿参数也会影响
到稳定性。所以,真要用VB弄个比较复杂的多线程处理过程,要调稳定还是比较麻烦
的,但是VB可以用多线程技术来处理程序这到是可以肯定的,只是麻烦点而已。
tianliang09 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 supermanking 的回复:]
引用 7 楼 tianliang09 的回复:
上网查了下 CopyMemory 的用法,不是很明白!
程序中为什么要使用 CopyMemory ,若不用的话,行吗?会出现什么情况?麻烦了!!!

我是用类实力重现的方法实现对象控制,这要说到指针问题,但你连CopyMemory的用法
都要上网查,这就麻烦了!根本没法和你解释下去。
[/Quote]

对vb的api函数了解不多,见笑了!
现在还是人类 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 tianliang09 的回复:]
上网查了下 CopyMemory 的用法,不是很明白!
程序中为什么要使用 CopyMemory ,若不用的话,行吗?会出现什么情况?麻烦了!!!
[/Quote]
我是用类实力重现的方法实现对象控制,这要说到指针问题,但你连CopyMemory的用法
都要上网查,这就麻烦了!根本没法和你解释下去。
tianliang09 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 supermanking 的回复:]
既然该语句在最后,而且把FormObj地址清为0,就表示释放对象呀。
[/Quote]


上网查了下 CopyMemory 的用法,不是很明白!
程序中为什么要使用 CopyMemory ,若不用的话,行吗?会出现什么情况?麻烦了!!!
现在还是人类 2011-04-15
  • 打赏
  • 举报
回复
既然该语句在最后,而且把FormObj地址清为0,就表示释放对象呀。
tianliang09 2011-04-15
  • 打赏
  • 举报
回复
针对于楼上的"CopyMemory FormObj, ClassAddress, 4"不明白,为什么大小为4?ClassAddress 的大小好像为零?
现在还是人类 2011-04-15
  • 打赏
  • 举报
回复
弄个范例大家看看:
1、先建立一个窗口,并向窗口中添加两个CommandButton控件和一个Label控件
2、修改Command1的Caption为“开始线程”
3、修改Command2的Caption为“停止线程”
窗口代码如下:

Private 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
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Sub Command1_Click()
Dim SendThreadID As Long
Dim ClassAddress As Long
IsRun = 1
CopyMemory ClassAddress, Me, 4
Call CreateThread(Null, ByVal 0&, AddressOf Module1.NewThread, ClassAddress, ByVal 0&, SendThreadID)
End Sub

Private Sub Command2_Click()
IsRun = 0
End Sub

然后向工程中添加一个模块 Module1,Module1 代码如下:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public IsRun As Long

Public Function NewThread(ByVal pParam As Long) As Long
Dim lSaveTime As Long
Dim lNowTime As Long
Dim FormObj As Form1
Dim i As Long
Dim ClassAddress As Long
Dim MCount As Long
Dim SCount As Long
lSaveTime = GetTickCount
MCount = 0
i = 0
ClassAddress = 0
CopyMemory FormObj, pParam, 4
Do
Sleep 3
lNowTime = GetTickCount
SCount = lNowTime - lSaveTime
If SCount > 1000 Then
lSaveTime = lNowTime
i = i + 1
FormObj.Label1.Caption = i & " 秒(线程运行时间)"
End If
Loop While IsRun = 1
CopyMemory FormObj, ClassAddress, 4
End Function

然后可以编译,编译P代码应该是可行的。
现在还是人类 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 veron_04 的回复:]
VB多线程,网上有很多所谓的多线程,我试验过,都没有成功。也许是我能力不够,但我仍然固执的认为VB6.0是不能做多线程的。
[/Quote]
VB是可以实现多线程的,这个是一定的,只是在做具体代码的时候需要注意些问题才能正常,
而且编译要P代码。还有就是不要以调试为准,以编译为准。
东方之珠 2011-04-15
  • 打赏
  • 举报
回复
用多线程专业控件ThreadFactory.exe,不过这是第三方的,我不太喜欢。
贝隆 2011-04-14
  • 打赏
  • 举报
回复
VB多线程,网上有很多所谓的多线程,我试验过,都没有成功。也许是我能力不够,但我仍然固执的认为VB6.0是不能做多线程的。

864

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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