Visual Basic 开发环境只支持一个执行线程。为了调试部件的多线程行为,必须先编译部件,然后运行一个测试应用程序来测试该部件。
对进程外部件而言,这意味着既要编译该部件,还需要编译测试程序,然后运行测试程序的多个副本。(也可以通过多个开发环境的实例来运行多个测试程序副本,但这样将无法跟踪进入编译后的部件。)
为了测试使用单元模型的 DLL 的多线程行为,需要将测试程序分为两部分:一部分是标准的可执行程序,用于进行测试;另一部分为一个多线程的进程外部件。标准的可执行程序作为进程外部件的客户端,进程外部件又是 DLL 的测试客户端。
例如,多线程进程外部件可以提供一个 TestMultiThreadDLL 类。标准的可执行程序可以创建数目不等的 TestMultiThreadDLL 对象,然后给每个对象设置一份测试参数,然后调用其 BeginTest 方法。
如“创建 ActiveX EXE 部件”所述,BeginTest 方法应打开一个纯代码的计时器,然后立刻返回,以避免阻碍单线程的标准 EXE。TestMultiThreadDLL 对象的计时器将控制进程内部件提供的对象的创建和测试。每个 TestMultiThreadDLL 对象将测试进程内部件内的一个线程(单元)。
注意 要使用这种测试技巧,既要编译多线程的进程外部件,也要编译 DLL。
如果要将部件编译为本地代码,并且拥有 Microsoft Visual C++,并且在编译部件时带有符号调试信息,那么就可以使用支持多线程调试的 Visual Studio 调试器进行调试。
由于在开发环境中不能调试多线程行为,因此不能使用 Debug.Print 和 Debug.Assert 来显示调试消息字符串。
也不能使用消息框来显示调试消息。因为“无用户界面执行”选项将完全禁止用户交互。
发送调试消息的途径包括:
多线程 ActiveX EXE 工程中的任何线程都可以调用这个单线程的 DLL。这种调用将是很慢的,因为这属于跨线程调度(请参阅“设计线程安全的 DLL”),不过在调试时这不算什么大问题。
提示 在调试消息文字中请包括线程 ID(ThreadID)。
详细信息 关于如何编译成本地代码,请参阅《程序员指南》中“再论编程”的“将工程编译成本地代码”。关于使用 AddressOf 操作符获得 windows 子类,请参阅《部件工具指南》的“访问 DLLs 和 Windows API”。