在VB6编程中使用线程

4
我正在编程使用不同的随机函数生成十六进制密钥,并将其写入文本文件。我只有两个命令按钮和状态栏,显示当前时间和进程状态。现在,当单击生成密钥的命令按钮时,窗体会被锁定,所有其他活动都会暂停,即使时间也会暂停,直到进程结束。我甚至不能在中途中止该进程。如果可能,我想使用线程来解决这个问题。请问我该怎么做?否则,如果有其他方法可以解决此问题,请建议。

非常感谢您宝贵的帮助。


2
哈哈,原来的标签用错了。感谢马克修复。除此之外,提问得很好! - TheSoftwareJedi
6个回答

8
在VB6中唯一“合法”的多线程方式是通过ActiveX EXE,在项目属性对话框中使用每个对象一个线程的选项。Matt Curland有一个很好的例子,如何将您的标准EXE转换为多线程ActiveX EXE。以这种方式进行操作允许VB6调试器在IDE中执行时不会崩溃,因为所有内容都在单个线程上执行。
如果要减少ActiveX EXE多线程的开销,则必须使用不受支持但仍可行的进程内多线程。请参阅Compact In-Process Multi-threading: A FolderWatcher with sample UI了解安全使用CreateThread和在新线程上安全初始化VB6运行时的方法(再次感谢Matt Curland)。
您可能需要查看他的Advanced Visual Basic 6书籍获取更多详细信息。

请查看Markdown参考文档,了解如何正确地进行超链接。您不能使用标准HTML。 - ConcernedOfTunbridgeWells
我注意到一个有趣的事情,当我使用ActiveX EXE进行多线程编程时,IDE调试模式的行为与构建EXE并运行EXE时不同。这是为什么呢? - melaos
@melaos:VB6 IDE始终是单线程的,因此为了可调试性,每个对象ActiveX EXE的线程行为都不同。 - wqw

2
你可以使用CreateThread Win32 API,但请记住VB6调试器无法处理多个线程。
此外,如果你有任何类型的循环,请在循环中添加"DoEvents"。这会严重影响性能,但可以使你的窗体响应。

0

0

可能不太可能,但您可能要考虑切换到.NET,在那里VB完全支持线程。

另一种机智的方法(不是很好,但它可以工作)可能是外壳一个exe来完成工作,并让您的VB6简单地轮询结果文件。这将是一个单独的进程,因此是完全隔离的线程。非常混乱,我不建议这样做。


另一种机智的方法是编写一个 ActiveX EXE 来完成工作,这样可以自动启动一个独立的进程和完全隔离的线程,但是您可以在这些线程之间传递数据,并让 COM 为您进行编组。通过回调向原始客户端信号任务已完成。此方法已在 Dan Appleman 的书《使用 VB6 开发 Com/ActiveX 组件》中有详细介绍。 - MarkJ
我在这个答案中写了更多关于它的内容。http://stackoverflow.com/questions/727386/making-a-c-kill-event-for-a-vb6-app/752841#752841 - MarkJ

0

0

可以使用Windows内核线程调用来实现,如下面的代码所示。

声明函数CreateThread Lib "kernel32" (lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long

声明函数TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long

声明函数CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

https://imasters.com.br/back-end/threads-em-vb6中查看源代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接