1)Как корректно прекратить выполнение функции DLL(вызывается в потоке), собранной Matlab Compiler 4.0 (2007b)?
2)Как организовать callback из этой функции для реализации прогресбара?
Вот что придумалось
1)создаем файл "mexcpp.cpp"
#include <iostream>
#include <math.h>
#include <windows.h>
#include <stdio.h>
#include "mex.h"
using namespace std;
extern void _main();
static
int ProgressCPP( UINT MSGID, WPARAM w, LPARAM l, char *NameMainForm )
{
int NeedBreak = 0;
HWND hWnd = FindWindow(0, NameMainForm);
SendMessage( hWnd, MSGID, w, (LPARAM)&NeedBreak );
return NeedBreak;
}
void mexFunction(
int nlhs,
mxArray *plhs[],
int nrhs,
const mxArray *prhs[]
)
{
UINT *MSGID = (UINT *)mxGetPr(prhs[0]);
WPARAM *w= (WPARAM *)(mxGetPr(prhs[1]));
LPARAM *l= (LPARAM *)(mxGetPr(prhs[2]));
char *NameMainForm = mxArrayToString(prhs[3]);
plhs[0] = mxCreateNumericMatrix(1, 1, mxUINT32_CLASS, mxREAL);
*(int *)mxGetPr(plhs[0])= ProgressCPP(*MSGID, *w, *l, NameMainForm);
return;
}
2)в командной строке matlab
mex -setup
и выбираем компилятор(у меня builder 6);
затем
mex mexcpp.cpp
и получаем mex файл с MEX-функцией
3)Полученный МЕХ файл добавляем к проекту DLL в ветку Other files
4)В экспортируемой M-функции добавляем 2 параметра MainFormName(заголовок окна которое будет перехватывать сообщения от sendmessage) и MSGID(id сообщения == WM_APP + x) и вызываем в нужных местах(в теле долго выполняемого цикла для индикации хода процесса...)
NeedBreak = mexcpp(uint32(MSGID), uint32(PP), uint32(0), MainFormName);
РР — progress position и т.п.
5)компилируем DLL
6)создаем обработчики сообщений WM_APP + x в основной программе. В WPARAM — что-то что запихали туда, в LPARAM — указатель на int переменную, значение которой вернется в NeedBreak в экспортируемой m-функции