|
<font face="Verdana">微软官方给出的方案在MSDN里面有说,就是使用ActiveX EXE那种"单元线程模型".<br/><br/>我也曾经试过,的确可以实现"多线程",只是由于要多一个EXE,比较麻烦,后来就没有深入了.<br/><br/>结果一次无意中在VBGOOD中看到一段代码,才打通了一个关节:为什么不直接使用ActiveX EXE写程序呢?!<br/><br/>那段代码里面,是直接使用这种工程类型,然后在工程内使用CreateObject来生成一个新对象,这样的话,新的对象就工作于一个单元线程内了.<br/><br/>其实这个我也知道,可是就没有想到在ActiveX EXE内部使用 <img style="MARGIN-TOP: 0px; MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px" alt="" src="http://www.m5home.com/blog/images/smilies/27.gif" border="0" -2px? 0px="0px" 0px?/><br/><br/>看来思路真的不如人.....还要多多学习,多多积累.<br/><br/>ActiveX EXE工程设置为"独立启动"后,貌似只能从Sub Main里进行初始化.<br/><br/>而每个对象的建立,都会调用一次这个过程,因此这个过程需要一次性运行.<br/><br/>但是MSDN里说得很清楚,在单元线程模型里面,全局变量的范围只能是本单元,因此不能使用设置全局变量来完成这个过程的一次运行逻辑.<br/><br/>原代码里使用了GetProp等方式,感觉不是很好,于是作了一下改进,使用事件对象来完成此工作.<br/><br/>Sub Main相关代码如下:
<div class="dp-highlighter">
<ol class="dp-vb">
<li class="alt"><span><span class="keyword">Private</span><span> </span><span class="keyword">Const</span><span> MyEvent </span><span class="keyword">As</span><span> </span><span class="keyword">String</span><span> = </span><span class="string">"m5home"</span><span> </span></span></li>
<li class=""><span></span><span class="keyword">Dim</span><span> hEvent </span><span class="keyword">As</span><span> </span><span class="keyword">Long</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li class=""><span></span><span class="keyword">Sub</span><span> Main() </span></span></li>
<li class="alt"><span> </span><span class="keyword">If</span><span> GetEventHandle = 0 </span><span class="keyword">Then</span><span> </span><span class="comment">'由于每个新对象的建立,都要执行Main()过程,因此使用事件对象来进行判断. </span><span> </span></span></li>
<li class=""><span> hEvent = CreateEvent(0&, </span><span class="keyword">False</span><span>, </span><span class="keyword">False</span><span>, MyEvent) </span><span class="comment">'在单元线程下,模块里的全局变量已经没有用了. </span><span> </span></span></li>
<li class="alt"><span> frmMain.Show </span></li>
<li class=""><span> </span><span class="keyword">End</span><span> </span><span class="keyword">If</span><span> </span></span></li>
<li class="alt"><span></span><span class="keyword">End</span><span> </span><span class="keyword">Sub</span><span> </span></span></li>
<li class=""><span> </span></li>
<li class="alt"><span></span><span class="keyword">Private</span><span> </span><span class="keyword">Function</span><span> GetEventHandle() </span><span class="keyword">As</span><span> </span><span class="keyword">Long</span><span> </span></span></li>
<li class=""><span> GetEventHandle = OpenEvent(EVENT_ALL_ACCESS, </span><span class="keyword">False</span><span>, MyEvent) </span></span></li>
<li class="alt"><span> </span><span class="keyword">Call</span><span> CloseHandle(GetEventHandle) </span></span></li>
<li class=""><span></span><span class="keyword">End</span><span> </span><span class="keyword">Function</span><span> </span></span></li>
<li class="alt"><span> </span></li>
<li class=""><span></span><span class="keyword">Public</span><span> </span><span class="keyword">Function</span><span> Quit() </span></span></li>
<li class="alt"><span> </span><span class="keyword">Call</span><span> CloseHandle(hEvent) </span></span></li>
<li class=""><span></span><span class="keyword">End</span><span> </span><span class="keyword">Function</span><span> </span></span></li></ol></div>
<p><textarea class="vb" style="DISPLAY: none" name="code" rows="15" cols="100">Private Const MyEvent As String = "m5home"
Dim hEvent As Long
Sub Main()
If GetEventHandle = 0 Then '由于每个新对象的建立,都要执行Main()过程,因此使用事件对象来进行判断.
hEvent = CreateEvent(0&, False, False, MyEvent) '在单元线程下,模块里的全局变量已经没有用了.
frmMain.Show
End If
End Sub
Private Function GetEventHandle() As Long
GetEventHandle = OpenEvent(EVENT_ALL_ACCESS, False, MyEvent)
Call CloseHandle(GetEventHandle)
End Function
Public Function Quit()
Call CloseHandle(hEvent)
End Function</textarea><br/><br/>由于事件对象是系统范围的,因此可以比较完美的完成这个工作.<br/><br/>同时事件对象在进程消失后,会自动释放,也方便 <br/><br/>示例代码可以生成一个新的单元线程,并在这个线程里面显示一个窗体,窗体进行一个大循环.<br/><br/>循环内没有放入DoEvents函数,因此会造成循环所在窗体无响应.<br/><br/>而此时主窗体不受影响.<br/><br/>对象间可以通过一般的调用与事件来进行通讯.<br/><br/>完整的代码,在此下载:</p>
<p> </p>
<p><a href="http://www.m5home.com/blog/article.asp?id=54">http://www.m5home.com/blog/article.asp?id=54</a></font></p> |
|