VB6回调Sub与调用win32线程的关系,反之亦然

时间:2014-06-05 21:31:59

标签: multithreading winapi vb6

win32进程中的函数(称之为void cCB())调用VB6 Sub(称之为vb6S,它从cCB接收一些数字数据类型数据.cCB最初通过AddressOf接收vb6S引用。

我有两个基本的新手问题:

问题1:当vb6S()执行其代码时,cCB的线程是否被调用阻止?

问题2:如果cCB的线程终止和cCB,VB是否会有任何“问题”             在vb6S完成其工作之前,内存是否已取消分配?

修改 的 为了回应代码请求(并且感谢那个downvote),这是问题所在:

该任务是一个微秒计时器,用于在调试两个通过WM_COPYDATA消息进行通信的VB应用程序时解锁两个VB IDE的WM队列。

那就是:有应用程序Alice和Bob。当Alice向Bob发送wm74(WM_COPYDATA)消息时,Bob会挂钩,将信息保存在copydatastruct中,然后完成消息。问题是,现在,在调试中,只要调试器处于断点,Alice和Bob的消息队列都会被阻塞。在那时杀死一个或两个IDE并不需要很长时间。

所以我想要实现的是一个旧的Java Applet技巧:Bob调用进程,等待一小段时间,然后回调。在进程失败时,Bob可以发布消息,即app / IDE告诉Windows消息处理,Alice可以开展业务。为此,在返回之前,Bob的消息处理程序调用win32 DLL函数,例如:

typedef void (__stdcall *FUNCPTR)(int);

void __stdcall ExecuteCallback(FUNCPTR cbAddress, double microS){};

Bob称之为

ExecuteCallback AddressOf My74Processor, 250

其中My74Processor包含应用程序逻辑,用于根据Alice放入消息结构中的代码中的案例处理字符串。

ExecuteCallback从那些队列中抓取现有的timingWork代码对象,并通过workQueue管理器将其放入线程队列,该管理器知道在timingWork类的适当位置启动线程。

在计时工作计时器通过观察QueryPerformanceCounter计时250微秒(在这种情况下)后,它会在

处回叫Bob的Sub

Sub My74Processor(ByVal reason as Long)

并终止。 timingWork对象不会被破坏;它做的最后一件事就是将自己放回可用对象的队列中。另一方面,该线程终止,并且在线程队列中可用于更多,可能不同的工作,当它再次出现时。

回到Bob,Sub My74Processor中的处理代码中设置了一个断点。那么,我的问题就是这样:

(a)当该断点被击中,并且程序员需要一些时间来检查变量和逻辑,然后继续该过程,在My74Processor结束后,Bob的IDE堆栈中的一切都会正常吗?

(b)当timingWork例程进行回调时,该线程是否会被阻止?

我几乎可以肯定(b)的答案是“不”。我很担心,并且没有足够的经验与VB6知道答案。

EDIT2 @wqw,我得出了与昨晚睡觉相同的结论,但不是因为你在评论中说明的正确理由。

怎么样:使用相同的进程外调用,而不是回调函数,发送cCB信息,以便向VB6S发送WM_COMMAND消息,欺骗其中一个控件的状态更改,比如一个按钮,但是-CB ?然后ExecuteCallback(..)变为ExecuteClickback(..)

void __stdcall ExecuteClickback(WORD butID, HANDLE hBut, HANDLE hVB6S, double microS){};

timerWork对象执行WM_COMMAND的PostMessage到hVB6S的表格:

wParam = (DWORD) ( (butID << sizeof(WORD)) + (WORD) BN_CLICKED ); lParam = hBut;

然后,VB6S的表单应该提升它的butCB_Click()事件。该事件处理程序将具有调用My74Processor()的指令。由于一旦调用ExecuteClickback,VB6S必然处于纯消息等待状态,WM_COMMAND的到达应该“看”到VB6S,就像用户实际点击按钮一样。

0 个答案:

没有答案