C++ & Matlab
От: caxaromires  
Дата: 01.08.11 05:42
Оценка:
1)Как корректно прекратить выполнение функции DLL(вызывается в потоке), собранной Matlab Compiler 4.0 (2007b)?
2)Как организовать callback из этой функции для реализации прогресбара?
Re: C++ & Matlab
От: caxaromires  
Дата: 24.08.11 15:41
Оценка:
Вот что придумалось

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-функции
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.