| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2352 人关注过本帖
标题:[求助]vb实现多线程
只看楼主 加入收藏
小妖1119
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2006-12-22
收藏
 问题点数:0 回复次数:16 
[求助]vb实现多线程
当弹出一个msgbox时,timer控件就暂停一下,直到关闭msgbox对话框,timer控件才继续有动作。
请问下,这个是不是多线程的问题?
搜索更多相关主题的帖子: 线程 
2006-12-23 08:55
rich_ying
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-12-22
收藏
得分:0 
多线程好象不是这样理解的.

eg:
服务端(只有一个),客户端可以有多个,
一般服务端会有一个守护进程,一直在监听客户端的请求,
一有请求就派生出一个子进程去处理一个客户端的请求,有多少个客户端请求,就会派生出几个子进程,
这才是多线程,要不然,当一个客户端连接上去后,只有处理完后,才处理第二个客户端请求,
所以单线程是会占线的,是要排队处理的,前面没有处理,后面是不能处理的,可多线程就不一样了,来一个处理一个,不会占线,
2006-12-23 09:05
小妖1119
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2006-12-22
收藏
得分:0 
那怎么去实现不管弹不弹出msgbox,timer控件一直有动作列?
2006-12-23 09:14
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
收藏
得分:0 

Private Sub Command1_Click()
MsgBox "暂停"

End Sub

Private Sub Timer1_Timer()
Static i As Integer
i = i + 1
Text1.Text = i

End Sub
这样就行了老兄...一弹出msgbox timer控件会自动暂停的...不信你可以测试一下这段代码!


/images/2011/147787/2011051411021524.jpg" border="0" />
2006-12-23 09:39
小妖1119
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2006-12-22
收藏
得分:0 
我的意思是弹出msgbox时,不让timer控件停止动作
我的疑惑是为什么弹出msgbox时,timer控件就不动作,为什么会出现停顿,可不可以消除这个停顿
2006-12-23 09:52
purana
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:广东-广州
等 级:版主
威 望:66
帖 子:6039
专家分:0
注 册:2005-6-17
收藏
得分:0 
因为这并不是多线程...
...因为msgBox是模式窗体...需要用户做出处理或关闭后...才能继续执行...否则..程序被阻塞..

我的msn: myfend@
2006-12-23 09:58
小妖1119
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2006-12-22
收藏
得分:0 
哦,谢谢,那有没有办法避免这个阻塞?
2006-12-23 10:01
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
得分:0 

尽管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一样快的程序.而且开发容易的多,开发速度也快得多.


[GLOW=255,DeepPink,3]我的免费网盘[/GLOW]
2006-12-23 10:03
purana
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:广东-广州
等 级:版主
威 望:66
帖 子:6039
专家分:0
注 册:2005-6-17
收藏
得分:0 

添加两个Timer控件...将Interval属性都设置为1000

然后编写下面代码...自己试试..

..不会阻塞...

Option Explicit
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetDlgItem Lib "user32" (ByVal hDlg As Long, ByVal nIDDlgItem As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
Private Const MB_OK = &H0&

Private Sub Timer1_Timer()
MessageBox Me.hwnd, "bc-cn", App.Title, MB_OK
End Sub

Private Sub Timer2_Timer()
Dim dlghwnd As Long, btnhwnd As Long
dlghwnd = FindWindow(vbNullString, App.Title)
If dlghwnd <> 0 Then
btnhwnd = GetDlgItem(dlghwnd, 2)
SendMessage btnhwnd, &HF5, 0&, 0&
End If
End Sub


我的msn: myfend@
2006-12-23 10:25
purana
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:广东-广州
等 级:版主
威 望:66
帖 子:6039
专家分:0
注 册:2005-6-17
收藏
得分:0 
建议用vb就不要去搞什么多线程...那不是vb搞的...
...还有8楼的..不要整天..去百度找这些东西了...谁都会去找..说实话..没什么意思.

我的msn: myfend@
2006-12-23 10:26
快速回复:[求助]vb实现多线程
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028185 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved