单机多核并行主要用到 IDL_IDLBridge 对象,以下面 for 循环构建:
Threads=4
p=objarr(threads) ;创建 4 个对象,也就是 4 个并行块。
for i=0,threads-1 do begin
p[i]=obj_new('IDL_IDLBridge',callback='oBridge_call') ;(1)定义回调函数,每次 IDLBridge
对象处理完成,都会自动调用这个回调函数,主要用于调试。
Imgname=’GF2_1.TIF’
p[i]->setproperty,userdata= Imgname ;(2)userdata 属性主要用于参数传递,类似于控件
的 uvalue,如果在回调函数中需要使用一些其他参数、信息,就可以将这些内容传到
userdata 中,在回调函数中可以直接使用。
;注意:凡是在 IDLBridge 对象中使用的任意参数、数据都需要先将这些内容传递到该对
象中,主要有 2 种方法:【1】IDLBridge 自带的 setvar 方法【2】shmmap(共享内存/共
享映射文件),shmvar 提供更改共享内存/共享映射文件内容的功能。
【1】
shmdata=2
p[i]->setvar,'shmdata',shmdata
【2】
data=read_tiff(‘’)
datadim=size(data,/d)
shmmap,’ 1’,dimension=datadim,/float ;’1’:类似于共享内存标识,就是该共享内存名称,
也可以自动生成,不用自己定义,使用 get_name=variable 关键字获得,需要预定义
dimension。
shmdata=shmvar(‘1’) ;与指定数组相关联
shmdata[0,0,0]=data ;为共享内存赋值
......
;IDLBridge 对象执行处理内容,主要通过 execute 方法实现。在主程序定义了共享内存,
要想在 IDLBridge 中使用,同样要通过 execute 方法执行上面类似的代码,以链接到该共享内
存,execute 中使用到 datadim 变量,需要先将该变量传递到对象中
p[i]->setvar,'datadim',datadim
p[i]->execute,"shmmap,'"+1+"',"+'dimension=datadim,/float'
p[i]->execute,'shmdata=shmvar('+"'"+1+"')"
;要通过 IDLBridge 执行的函数,需要使用 execute 方法先编译。先将该函数路径传递给
对象,再编译该函数,最后执行该函数。
buildingHeightCalculatepath=’**\buildingHeightCalculate.pro’
p[i]->setvar,'buildingHeightCalculatepath',buildingHeightCalculatepath
p[i]->execute,'.compile ' +"'"+buildingHeightCalculatepath+"'";compile 后空一格
;传递其他需要用到的参数 shmpara[0]、shmpara[1]…
……….
;(2)对于 buildingHeightCalculate 函数中调用的自定义函数,也需要传递该函数路径到
对象中并编译,而对于其中调用的过程则不需要。这些函数要单独写出一个独立 pro 文件。
Total_a_b_path=’**\total_a_b.pro’
p[i]->setvar,' Total_a_b_path ', Total_a_b_path
p[i]->execute,'.compile ' +"'"+ Total_a_b_path +"'";compile 后空一格
评论0