VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 3753|回复: 11

[求助] VB 多线程 能有效使用【全局变量】吗?

[复制链接]
发表于 2015-8-20 11:05:23 | 显示全部楼层 |阅读模式
最近在DLL 中需要用到  多线程 全局变量。但好像效果并不理想。

首先感谢 @菜鸟学飞   的多次开源。

在【菜鸟学飞】  开发   VB多线程时 就已经发现了多线程无法使用全局遍历。
详情:http://www.vbgood.com/thread-107708-1-1.html

在下面   @19900603  提出了 一种间接的方法。
就是把全局遍历放在一个线程中(不死线程),这样就不会引起对全局变量的清空。



综合以上所述,请问大师们 现在有比较有效的方法实现多线程的全局变量吗?
发表于 2015-8-21 17:57:02 | 显示全部楼层
自己用api申请 肯定没人会清理你的
回复 支持 反对

使用道具 举报

发表于 2015-8-21 21:27:22 | 显示全部楼层
本帖最后由 菜鸟学飞 于 2015-8-21 21:28 编辑

我刚刚想到一种比较猥琐的办法
全部全局变量都放到一个结构体中定义
在创建线程之前首先将所有全局变量保存到一个命名的内存映射对象中,
在线程函数里面,根据内存映射对象保存的内容恢复到全局变量中

回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-22 21:46:03 | 显示全部楼层
菜鸟学飞 发表于 2015-8-21 21:27
我刚刚想到一种比较猥琐的办法
全部全局变量都放到一个结构体中定义
在创建线程之前首先将所有全局变量保 ...

我OD看了一下 当线程退出的时候它会对 遍历做初始化。
放到一个命名内存中 的确有点猥琐。
代码量也会比直接放到一个线程中多。感觉VB多线程已经很牵强了。

回复 支持 反对

使用道具 举报

发表于 2015-9-9 15:45:16 | 显示全部楼层
qq275158045 发表于 2015-8-22 21:46
我OD看了一下 当线程退出的时候它会对 遍历做初始化。
放到一个命名内存中 的确有点猥琐。
代码量也会比 ...

这是为了保护你的程序不崩溃
回复 支持 反对

使用道具 举报

发表于 2015-9-9 23:17:00 | 显示全部楼层
本帖最后由 苍茫 于 2015-9-9 23:22 编辑

用VC 写个多线程的DLL 给VB6调用,稳稳当当。

//thread.dll

#include<windows.h>

DWORD  WINAPI ThreadProc(LPVOID p)
{
        long* pTemp = (long*)p;
        *pTemp = 100;
        return 0;
}

HANDLE WINAPI CreateMyThread(LPVOID lpParameter,LPDWORD lpThreadId)
{

        HANDLE hThread=CreateThread(NULL,0,ThreadProc,lpParameter,0,lpThreadId);
        WaitForSingleObject(hThread,INFINITE);
        return hThread;
}

' in vb6 std module

Option Explicit
Public g_value As Long


Private Declare Function ThreadProc Lib "D:\新建文件夹\thread.dll" (lParam As Long) As Long
Private Declare Function CreateMyThread Lib "D:\新建文件夹\thread.dll" (p As Long, id As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Sub main()
   g_value = 999
   Dim hThread As Long, id As Long, s As String
   
   s = "g_value = " & g_value & vbCrLf
   hThread = CreateMyThread(g_value, id)
   CloseHandle hThread
   s = s & "now,g_value = " & g_value
   MsgBox s
End Sub




// display:
回复 支持 反对

使用道具 举报

发表于 2015-9-9 23:22:45 | 显示全部楼层
附上效果图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2015-9-9 23:26:41 | 显示全部楼层
菜鸟学飞 发表于 2015-8-21 21:27
我刚刚想到一种比较猥琐的办法
全部全局变量都放到一个结构体中定义
在创建线程之前首先将所有全局变量保 ...

的确一个线程 一次只能传一个指针,要遍历所有全局变量,只有把所有全局变量集中在一起,数据类型如数组或链表等。
回复 支持 反对

使用道具 举报

发表于 2015-9-19 08:57:55 | 显示全部楼层
我用多线程也有全局变量,每个线程都会使用到,没发现数据有丢失啊,一切很正常的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-21 14:04:55 | 显示全部楼层
zhang_game 发表于 2015-9-19 08:57
我用多线程也有全局变量,每个线程都会使用到,没发现数据有丢失啊,一切很正常的。

上面有说道 A线程中 设置全局变量(只要A线程不死) 其他线程就可以继续使用这个全局变量。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-7-5 12:05

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表