多线程部件的调试限制

Visual Basic 开发环境只支持一个执行线程。为了调试部件的多线程行为,必须先编译部件,然后运行一个测试应用程序来测试该部件。

进程外部件

对进程外部件而言,这意味着既要编译该部件,还需要编译测试程序,然后运行测试程序的多个副本。(也可以通过多个开发环境的实例来运行多个测试程序副本,但这样将无法跟踪进入编译后的部件。)

进程内部件

为了测试使用单元模型的 DLL 的多线程行为,需要将测试程序分为两部分:一部分是标准的可执行程序,用于进行测试;另一部分为一个多线程的进程外部件。标准的可执行程序作为进程外部件的客户端,进程外部件又是 DLL 的测试客户端。

例如,多线程进程外部件可以提供一个 TestMultiThreadDLL 类。标准的可执行程序可以创建数目不等的 TestMultiThreadDLL 对象,然后给每个对象设置一份测试参数,然后调用其 BeginTest 方法。

如“创建 ActiveX EXE 部件”所述,BeginTest 方法应打开一个纯代码的计时器,然后立刻返回,以避免阻碍单线程的标准 EXE。TestMultiThreadDLL 对象的计时器将控制进程内部件提供的对象的创建和测试。每个 TestMultiThreadDLL 对象将测试进程内部件内的一个线程(单元)。

注意 要使用这种测试技巧,既要编译多线程的进程外部件,也要编译 DLL。

使用本地代码调试器

如果要将部件编译为本地代码,并且拥有 Microsoft Visual C++,并且在编译部件时带有符号调试信息,那么就可以使用支持多线程调试的 Visual Studio 调试器进行调试。

调试消息

由于在开发环境中不能调试多线程行为,因此不能使用 Debug.Print 和 Debug.Assert 来显示调试消息字符串。

也不能使用消息框来显示调试消息。因为“无用户界面执行”选项将完全禁止用户交互。

发送调试消息的途径包括:

提示 在调试消息文字中请包括线程 ID(ThreadID)。

详细信息 关于如何编译成本地代码,请参阅《程序员指南》中“再论编程”的“将工程编译成本地代码”。关于使用 AddressOf 操作符获得 windows 子类,请参阅《部件工具指南》的“访问 DLLs 和 Windows API”。