在做SWMM二次开发的时候,采用C#封装界面调用C dll,现在我想调用swmm_run函数,实时获取内部elapsedTime这个运行参数来在WPF界面上更新进度条,不知道应该怎样调用?
int DLLEXPORT swmm_run(char* f1, char* f2, char* f3)
{
long newHour, oldHour = 0;
long theDay, theHour;
double elapsedTime = 0.0;
// --- open the files & read input data
ErrorCode = 0;
swmm_open(f1, f2, f3);
// --- run the simulation if input data OK
if ( !ErrorCode )
{
// --- initialize values
swmm_start(TRUE);
// --- execute each time step until elapsed time is re-set to 0
if ( !ErrorCode )
{
do
{
swmm_step(&elapsedTime);
newHour = (long)(elapsedTime * 24.0);
if ( newHour > oldHour )
{
theDay = (long)elapsedTime;
theHour = (long)((elapsedTime - floor(elapsedTime)) * 24.0);
oldHour = newHour;
}
} while ( elapsedTime > 0.0 && !ErrorCode );
}
}
dll的代码是不是你写的?如果可以修改,可以增加一个回调函数(函数指针)作为参数
C++的函数的局部变量,原则上是无法直接访问的。除非你不按原则,强行去访问堆栈,而且变量在堆栈上的位置又是固定的情况下。
dll在计算了elapsedTime后报告进度。
如果不行,只能使用伪进度报告,也就是主程序自己估进度,用多线程异步调用dll
我仔细看了一下,题主你这是什么问题,你动态库里面东西封装死的,外面怎么可能调用的到,你要把这数返回去,你先得有个地方返回数据。
改写函数swmm_run, 加回调函数参数,该回调函数的调用并嵌入到do while循环中。