Visual c++ 为什么vb6应用程序的窗口在调用用C编写的函数时会暂停?

Visual c++ 为什么vb6应用程序的窗口在调用用C编写的函数时会暂停?,visual-c++,vb6,Visual C++,Vb6,我使用3.9.7curl库从互联网下载文件,所以我创建了一个动态的viculo bibioteca。使用VC++6.0用C编写的dll问题是,当我从vb6应用程序窗口调用函数时,只有在您下载文件后才锁定和解锁,我如何解决此问题?签出,它演示了如何使用用户控件中鲜为人知的方法异步传输大文件。签出,它演示了如何使用用户控件中鲜为人知的方法异步传输大文件。问题是,当您从DLL调用函数时,它会“阻塞”您的应用程序将一直执行到完成为止。基本上,执行从进行函数调用的代码段开始,到函数调用内部的代码,然后在函

我使用3.9.7curl库从互联网下载文件,所以我创建了一个动态的viculo bibioteca。使用VC++6.0用C编写的dll问题是,当我从vb6应用程序窗口调用函数时,只有在您下载文件后才锁定和解锁,我如何解决此问题?

签出,它演示了如何使用用户控件中鲜为人知的方法异步传输大文件。

签出,它演示了如何使用用户控件中鲜为人知的方法异步传输大文件。

问题是,当您从DLL调用函数时,它会“阻塞”您的应用程序将一直执行到完成为止。基本上,执行从进行函数调用的代码段开始,到函数调用内部的代码,然后在函数调用之后,在函数内部的代码完成运行之后,才返回到下一行。事实上,所有函数调用都是这样工作的。通过在VB6开发环境中单步执行代码,您可以自己看到这一点

您通常不会注意到这一点,因为在将控件返回给调用方之前,正在调用的函数内部的代码不会花很长时间执行。但在本例中,由于从DLL调用的函数正在进行大量处理,因此执行需要一段时间,因此它会在相当长的一段时间内“阻止”应用程序代码的执行

对于应用程序窗口被冻结的原因,这是一个很好的一般性解释。从技术上讲,这是因为负责处理用户与屏幕元素交互的消息泵没有运行(这是代码的一部分,在调用的函数完成处理之前,它已被暂时挂起)。对于VB程序员来说,这更难理解,因为在VB的世界中,这些基本的东西都没有暴露出来。这一切都是在幕后发生的,就像在C程序中一样,但你通常不需要处理任何事情。然而,偶尔,抽象会泄露,本质会露出丑陋的头颅。这就是其中之一

正如其他人所暗示的那样,这个一般问题的正确解决方案是在后台线程上运行长时间的操作。这样,您的主线程(现在是您仅有的一个线程,应用程序正在运行的线程)可以继续处理用户输入,而另一个线程可以处理数据,并在完成后将处理后的数据返回主线程。当然,计算机实际上一次只能做一件事,但操作系统在一个任务和另一个任务之间快速切换的魔力意味着你可以模拟这一点。执行此操作的机制涉及线程

问题在于VB6环境不支持创建多个线程。您只有一个线程,这是应用程序运行的主线程。若您冻结了那个一个的执行,即使是暂时的,您的应用程序也会冻结,正如您已经发现的那个样

但是,如果你已经编写了一个C++ DLL,你就没有理由在VB 6应用程序中不能创建多个线程。你只需要处理自己的一切,就像你使用的是另一种低级语言,比如C++。在后台线程上运行C++代码,并且在完成后只将其结果返回到主线程。同时,你的主线程是免费的


不过,这仍然是一项相当多的工作,尤其是在Win32编程和围绕多线程的问题方面缺乏经验的情况下。找到一个支持即时异步函数调用的不同库可能更容易。使用VB的。这可能是一个很好的选择;正如Karl Peterson在链接文章中所说,它将所有内容都保存在纯VB6代码中,这对未来的维护程序员来说是一个实时的节约,也是一个福音。唯一的问题是,一旦获得数据,您仍然必须以某种方式处理它。如果这很慢,你就回到了开始的地方…

问题是,当你从DLL调用函数时,它会“阻止”你的应用程序执行,直到它完成为止。基本上,执行从进行函数调用的代码段开始,到函数调用内部的代码,然后在函数调用之后,在函数内部的代码完成运行之后,才返回到下一行。事实上,所有函数调用都是这样工作的。通过在VB6开发环境中单步执行代码,您可以自己看到这一点

您通常不会注意到这一点,因为在将控件返回给调用方之前,正在调用的函数内部的代码不会花很长时间执行。但在本例中,由于从DLL调用的函数正在进行大量处理,因此执行需要一段时间,因此它会在相当长的一段时间内“阻止”应用程序代码的执行

对于应用程序窗口被冻结的原因,这是一个很好的一般性解释。从技术上讲,这是因为负责处理用户与屏幕元素交互的消息泵没有运行(这是代码的一部分,在调用的函数完成处理之前,它已被暂时挂起)。对于VB程序员来说,这更难理解,因为在VB的世界中,这些基本的东西都没有暴露出来。这一切都是在幕后发生的,就像在C程序中一样,但你通常不需要处理任何事情。然而,偶尔,抽象会泄露,本质会露出丑陋的头颅。这就是其中之一

正如其他人所暗示的那样,这个一般问题的正确解决方案是在后台运行长时间的操作