我看了一下 myjian 介绍的源码, 主工程exe中按下“MulGet”按钮, 最终由此句“GetCode1.GetWebCode Url_1”调用ActiveX exe, 而ActiveX exe执行下面的代码 Public Sub GetWebCode(ByVal Addr As String) iNetFrm.WebAddr = Addr iNetFrm!Timer1.Enabled = True End Sub 你若把GetWebCod()过程内的代码换成一个长任务的代码试试,举个不太好的例子,用个死循环, 结果会怎样,ActiveX exe不给主工程exe返回值,主工程就死主了。 如下 Public Sub GetWebCode(ByVal Addr As String) iNetFrm.WebAddr = Addr iNetFrm!Timer1.Enabled = True Do While (1) DoEvents Loop End Sub 此时,用鼠标移动主工程exe,主工程exe窗体就会弹出一个对话框,显示: “由于其它应用程序忙,不能执行操作”。这和进程内的ActiveX dll的表现是一样的, 此时主工程exe界面上的所有操作都无法进行了。 这说明主工程exe被ActiveX exe阻塞了,在ActiveX exe被调用过程代码执行结束前, 主工程exe什么事情也无法进行。大家不妨试一下。 我是对vb的ActiveX编程失望了,正在学vc的dll编程呢。
在vb6中使用多线程是找死,调试非常麻烦,ide很容易挂掉,只能编译后用outputdebugstring进行调试。在网上下载debugview可以看到debug信息 创建多线程的方法: 1、在dll中建立一个模块,声明api函数createthread 2、在模块中创建一个public的工作线程入口函数 3、使用addressof运算符得到工作线程入口函数的地址 示例如下,最好编译后再允许,否则ide非常容易崩溃:'在模块中 Option Explicit '请注意此api与apiview的声明参数不一样,有修改 Public Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Long, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As LongPublic Function MyThread(lParam As Long) As Long Dim i As Long For i = 1 To 5 MsgBox "Work Thread " & i Next i End Function'在主窗口中 Option Explicit Private Handle As Long Private ThreadId As Long Private Sub Command1_Click() Handle = CreateThread(0&, 0&, AddressOf MyThread, 0&, 0&, ThreadId) Dim i As Long For i = 1 To 5 MsgBox "Main Thread " & i Next End Sub
谁有好的思路或好的示例程序呀,提供出来共大家参考一下,共同研究!
主工程exe中按下“MulGet”按钮,
最终由此句“GetCode1.GetWebCode Url_1”调用ActiveX exe,
而ActiveX exe执行下面的代码
Public Sub GetWebCode(ByVal Addr As String)
iNetFrm.WebAddr = Addr
iNetFrm!Timer1.Enabled = True
End Sub
你若把GetWebCod()过程内的代码换成一个长任务的代码试试,举个不太好的例子,用个死循环,
结果会怎样,ActiveX exe不给主工程exe返回值,主工程就死主了。
如下
Public Sub GetWebCode(ByVal Addr As String)
iNetFrm.WebAddr = Addr
iNetFrm!Timer1.Enabled = True
Do While (1)
DoEvents
Loop
End Sub
此时,用鼠标移动主工程exe,主工程exe窗体就会弹出一个对话框,显示:
“由于其它应用程序忙,不能执行操作”。这和进程内的ActiveX dll的表现是一样的,
此时主工程exe界面上的所有操作都无法进行了。
这说明主工程exe被ActiveX exe阻塞了,在ActiveX exe被调用过程代码执行结束前,
主工程exe什么事情也无法进行。大家不妨试一下。
我是对vb的ActiveX编程失望了,正在学vc的dll编程呢。
创建多线程的方法:
1、在dll中建立一个模块,声明api函数createthread
2、在模块中创建一个public的工作线程入口函数
3、使用addressof运算符得到工作线程入口函数的地址
示例如下,最好编译后再允许,否则ide非常容易崩溃:'在模块中
Option Explicit
'请注意此api与apiview的声明参数不一样,有修改
Public Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Long, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As LongPublic Function MyThread(lParam As Long) As Long
Dim i As Long
For i = 1 To 5
MsgBox "Work Thread " & i
Next i
End Function'在主窗口中
Option Explicit
Private Handle As Long
Private ThreadId As Long
Private Sub Command1_Click()
Handle = CreateThread(0&, 0&, AddressOf MyThread, 0&, 0&, ThreadId)
Dim i As Long
For i = 1 To 5
MsgBox "Main Thread " & i
Next
End Sub
想在VB中实现多线程,实在是成问题
我正在写一个上下级数据同步的程序,一个服务端,多个客户端,客户端向服务端发消息,服务端收到消息后到客户端上去取数据,理论上服务端可以同时响应多个客户端。但是现在问题就在每次收到第二个客户端请求时,第一个任务就会被挂起,直到第二个任务处理完才继续。刚开始我是用一个类模块实现的,出现了这个问题,后来我用myjian的方法处理,还是这样。请问一下,这是因为线程的原因吗???