送你一段代码
出处:http://www.csdn.net/expert/topic/460/460324.xml?temp=.4055292
异步通知演示 异步通知演示 异步通知演示 异步通知演示 异步通知演示 异步通知演示我曾经遇到一个问题:
一个日程安排软件,有主程序与提醒程序两个EXE,当在主程序中设定了新的日程,则提醒程序不可能知道。如何让提醒程序重新读数据呢?
开始我想用DDE,可后来DDE超时,所以,后来想用内存共享,但最后改用了:《异步通知》
在这里,也曾经有人问过,两个EXE,控件中的数据如何同步。
其实,VB中就有这样的例子, Coffee
但这个例子非常复杂,一般人不易看懂,其中讲了异步通知,多线程,回调,以及ActiveX exe 构件的原理。
这时我想将我写的异步通知演示的代码送给大家。你们一定会发现,这是由Coffee 简代而来。对的!!!AsynSvr.VBP
----------------------------------------
Type=OleExe
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\WINNT\System32\stdole2.tlb#OLE Automation
Module=ModAsyn; ModAsyn.bas
Class=AsynMonitor; AsynMoitor.cls
Class=Connector; Connector.cls
Startup="(None)"
HelpFile=""
Title="AsynMonitor"
ExeName32="AsynMonitor.exe"
Command32=""
Name="AsynSvr"
HelpContextID="0"
Description="AsynDemo"
CompatibleMode="1"
CompatibleEXE32="AsynMonitor.exe"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
VersionCompanyName="Microsoft"
CompilationType=0
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=1
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
DebugStartupOption=0[MS Transaction Server]
AutoRefresh=1[RVB]
DeleteClass1=AsynMonitor2
DeleteClass2=Connector2
DeleteClass3=IAsynNotify
_______________________________________________________AsynMoitor.cls
_______________________________________________________
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "AsynMonitor"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
Option ExplicitEvent AsynReady(ByVal sData As String)Public Sub sDataInterChange(ByVal sData As String) RaiseEvent AsynReady(sData)End Sub_______________________________________________________________
Connector.cls_______________________________________________________________
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "Connector"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = True
Option ExplicitDim AsynCount As IntegerPublic Property Get AsynMonitor() As AsynMonitor AsynCount = AsynCount + 1
If gAsynMonitor Is Nothing Then
Set gAsynMonitor = New AsynMonitor
End If
Set AsynMonitor = gAsynMonitorEnd PropertyPrivate Sub Class_Terminate()
AsynCount = AsynCount - 1
If AsynCount = 0 Then
Set AsynMonitor = Nothing
End If
End Sub
_________________________________________________
ModAsyn.bas_________________________________________________
Attribute VB_Name = "ModAsyn"
Option ExplicitPublic gAsynMonitor As AsynMonitor
出处:http://www.csdn.net/expert/topic/460/460324.xml?temp=.4055292
异步通知演示 异步通知演示 异步通知演示 异步通知演示 异步通知演示 异步通知演示我曾经遇到一个问题:
一个日程安排软件,有主程序与提醒程序两个EXE,当在主程序中设定了新的日程,则提醒程序不可能知道。如何让提醒程序重新读数据呢?
开始我想用DDE,可后来DDE超时,所以,后来想用内存共享,但最后改用了:《异步通知》
在这里,也曾经有人问过,两个EXE,控件中的数据如何同步。
其实,VB中就有这样的例子, Coffee
但这个例子非常复杂,一般人不易看懂,其中讲了异步通知,多线程,回调,以及ActiveX exe 构件的原理。
这时我想将我写的异步通知演示的代码送给大家。你们一定会发现,这是由Coffee 简代而来。对的!!!AsynSvr.VBP
----------------------------------------
Type=OleExe
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\WINNT\System32\stdole2.tlb#OLE Automation
Module=ModAsyn; ModAsyn.bas
Class=AsynMonitor; AsynMoitor.cls
Class=Connector; Connector.cls
Startup="(None)"
HelpFile=""
Title="AsynMonitor"
ExeName32="AsynMonitor.exe"
Command32=""
Name="AsynSvr"
HelpContextID="0"
Description="AsynDemo"
CompatibleMode="1"
CompatibleEXE32="AsynMonitor.exe"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
VersionCompanyName="Microsoft"
CompilationType=0
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=1
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
DebugStartupOption=0[MS Transaction Server]
AutoRefresh=1[RVB]
DeleteClass1=AsynMonitor2
DeleteClass2=Connector2
DeleteClass3=IAsynNotify
_______________________________________________________AsynMoitor.cls
_______________________________________________________
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "AsynMonitor"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
Option ExplicitEvent AsynReady(ByVal sData As String)Public Sub sDataInterChange(ByVal sData As String) RaiseEvent AsynReady(sData)End Sub_______________________________________________________________
Connector.cls_______________________________________________________________
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "Connector"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = True
Option ExplicitDim AsynCount As IntegerPublic Property Get AsynMonitor() As AsynMonitor AsynCount = AsynCount + 1
If gAsynMonitor Is Nothing Then
Set gAsynMonitor = New AsynMonitor
End If
Set AsynMonitor = gAsynMonitorEnd PropertyPrivate Sub Class_Terminate()
AsynCount = AsynCount - 1
If AsynCount = 0 Then
Set AsynMonitor = Nothing
End If
End Sub
_________________________________________________
ModAsyn.bas_________________________________________________
Attribute VB_Name = "ModAsyn"
Option ExplicitPublic gAsynMonitor As AsynMonitor
解决方案 »
- 怎样让一个字段只在水晶报表的最后一页显示
- 邮件里的附件aa.rar,选中它后点击右键,在弹出菜单中选“目标另存为”,就会出现下载窗体,接着又出现“另存为”对话框,在文件名窗口中
- 如何使用RichTextBox控件讀取rtf文件的某一部分
- 如何取出VB标准控件(如CommandButton,TextBox等)有哪些属性方法????
- 关于VB中数据库的问题
- 如何编程得到本地机器的机器名及IP?
- 一个很简单的问题!但散分不少哦!快进来看看!
- 请大家帮忙解决一个很简单的问题关于datagrid 的,小妹妹先谢谢了呀.
- 如何在datagrid中实现根据所选择的行显示不同的ToolTip(急)?
- 关于Winsock接受数据的问题
- 请问如何动态创建一ComboBox空件,其 Style=2(DropDown List)?
- 300分系列之一:如何实现图片的淡入淡出?
___________________________________________________
Type=Exe
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\WINNT\System32\stdole2.tlb#OLE Automation
Reference=*\G{EC762E77-606A-4953-A6C7-8E703A123172}#1.0#0#AsynMonitor.exe#AsynDemo
Form=FrmAsyn.frm
Module=ModAsynCli; ModAsynCli.bas
Startup="Sub Main"
HelpFile=""
Command32=""
Name="AsynClient"
HelpContextID="0"
Description="Test"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
VersionCompanyName="Microsoft"
CompilationType=0
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1[MS Transaction Server]
AutoRefresh=1[RVB]
DeleteClass1=frmThread
DeleteClass2=AsynTracker
DeleteClass3=NotifyMe______________________________________________________FrmAsyn.frm______________________________________________________
VERSION 5.00
Begin VB.Form FrmAsyn
Caption = "AnsyDemo"
ClientHeight = 3750
ClientLeft = 1800
ClientTop = 1500
ClientWidth = 5430
LinkTopic = "Form1"
LockControls = -1 'True
ScaleHeight = 3750
ScaleWidth = 5430
Begin VB.TextBox TxtSender
Height = 765
Left = 270
MultiLine = -1 'True
TabIndex = 4
Top = 2070
Width = 4845
End
Begin VB.CommandButton CmdExit
Caption = "EXIT"
Height = 375
Left = 3390
TabIndex = 2
Top = 3030
Width = 885
End
Begin VB.CommandButton CmdSend
Caption = "SEND"
Enabled = 0 'False
Height = 375
Left = 2205
TabIndex = 1
Top = 3030
Width = 885
End
Begin VB.CommandButton cmdEvents
Caption = "START"
Height = 375
Left = 1020
TabIndex = 0
Top = 3030
Width = 885
End
Begin VB.Label LabComment
Height = 1065
Left = 300
TabIndex = 5
Top = 900
Width = 4785
End
Begin VB.Label LabReceive
BackColor = &H80000009&
BorderStyle = 1 'Fixed Single
Height = 675
Left = 270
TabIndex = 3
Top = 150
Width = 4845
End
End
Attribute VB_Name = "FrmAsyn"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option ExplicitPrivate WithEvents mwcmnEvents As AsynMonitor
Attribute mwcmnEvents.VB_VarHelpID = -1Private mcctEvents As ConnectorPrivate Sub cmdEvents_Click()
Static blnInUse As Boolean If blnInUse Then
Set mwcmnEvents = Nothing
Set mcctEvents = Nothing
cmdEvents.Caption = "START"
CmdSend.Enabled = False
Else
Set mcctEvents = New Connector
Set mwcmnEvents = mcctEvents.AsynMonitor
cmdEvents.Caption = "STOP"
CmdSend.Enabled = True
End If blnInUse = True Xor blnInUseEnd SubPrivate Sub CmdExit_Click()
If Not mwcmnEvents Is Nothing Then
Call cmdEvents_Click
End If
End SubPrivate Sub CmdSend_Click()
If Len(TxtSender.Text) <> 0 Then
mwcmnEvents.sDataInterChange TxtSender.Text
End If
End SubPrivate Sub Form_Load() LabComment.Caption = "1、Please click the command button START. " & vbCrLf & _
"2、Type some word in the text box then click the command button SEND and look what happens." & vbCrLf & _
"Code By Bardo Keyo " & vbCrLf & _
"Mail: [email protected] "End SubPrivate Sub Form_Unload(Cancel As Integer)
If Not mwcmnEvents Is Nothing Then
Call cmdEvents_Click
End If
End SubPrivate Sub mwcmnEvents_AsynReady(ByVal sData As String) LabReceive.Caption = sDataEnd Sub_____________________________________________________________ModAsynCli.bas______________________________________________________________
Attribute VB_Name = "ModAsynCli"
Option ExplicitSub Main()
If App.StartMode = vbSModeStandalone Then
FrmAsyn.Show
End If
End Sub说明:
以上共七个文件。注意,线下面是文件的首行。要按此复制存为相应的文件名。
必须这么做,否则属性不对,则无法运行。先打开一个VB,将AsynSvr.vbp 运行然后才可以打开另一个VB,将 AsynClient.vbp 引用后,再次运行。
按F8单步,即可以发现其原理。
如果先将AsynSvr.vbp 生成Activex EXE,
再将 AsynClient.vbp编译两个不同名的EXE, 则两个或多个EXE之间可以通信。但愿大家喜欢!!
试着回答一下别人的问题,不论大小会使你进步。to shawls(小山(坚持VB,学VB.net和C#)) :
用COM来实现多线程,回调,异步通讯本来就是官方推荐的方法,是每一
个学VB的人都应该搞懂的。关于这方面的问题,VB的文档讲得还是不错的。
不过,在VB里用COM还有局限,还有很多需要我们去突破的Limits。
就异步通讯,我的研究已经有近十种方法了,COM不过只是一种。