MatLab:parfeval()不';t调用函数

MatLab:parfeval()不';t调用函数,matlab,parallel-processing,background,Matlab,Parallel Processing,Background,我试图接近实时地处理来自UDP服务器的数据 为此,我编写了这段MatLab代码,用UDP数据报填充缓冲区,并在MatLab函数的缓冲区已满(myBuffer)后处理数据(拆分字符串等) 在处理数据的过程中(大约需要0.9秒),我需要继续接收数据并将它们存储在(现在)清空的缓冲区中 我发现“并行计算工具箱”的parfeval函数可能适合我的需要,因为我需要我的函数“ProcessData”在后台运行 我遇到的问题是,我无法使它运行,因为parfeval函数没有输入我的函数ProcessData。我

我试图接近实时地处理来自UDP服务器的数据

为此,我编写了这段MatLab代码,用UDP数据报填充缓冲区,并在MatLab函数的缓冲区已满(myBuffer)后处理数据(拆分字符串等)

在处理数据的过程中(大约需要0.9秒),我需要继续接收数据并将它们存储在(现在)清空的缓冲区中

我发现“并行计算工具箱”的parfeval函数可能适合我的需要,因为我需要我的函数“ProcessData”在后台运行

我遇到的问题是,我无法使它运行,因为parfeval函数没有输入我的函数ProcessData。我在ProcessData()中设置了一个断点进行了测试,但程序从未停止过。我对函数参数做了什么错误吗

这就是MatLab help所说的:F=parfeval(p,fcn,numout,in1,in2,…)请求在并行池p中包含的工作进程上异步执行函数fcn,期望numout输出参数,并在in1,in2,…,中作为输入参数提供

希望你们能帮我解决这个问题!提前谢谢

function ReadVoltage

    %% Specify a Server (host name or IP address) with Port 8080
    u = udp('192.168.0.164', 8080);  %UDP Object Zuhause
    %u = udp('169.254.38.221', 8080);  %UDP Object Pilotfabrik    

    % Buffer in the enclosing function
    myBuffer = {};  %Initialisierung
    MAXBUFFLEN = 100; %Maximale Anzahl an Eintraegen in Buffer (1 Eintrage = 1 Datagram)

    u.InputBufferSize = 4060; 
    u.ReadAsyncMode = 'continuous';
    u.DatagramReceivedFcn = @DatagramReceivedFcn;
    u.ErrorFcn = @ErrorFcn;
    u.DatagramTerminateMode = 
    u.Terminator = '!';

    %% Initialize Parallel pool 
    pool = gcp();

    %% Oeffnen der Verbindung
    fopen(u);

     if (~strcmp(u.Status,'open'))
         NetworkError(u,'Connection failed!');
     end


    %% Start Data transmission by trigger
    fprintf(u, 'Requesting Data')

    %% Callback Funktion
    function DatagramReceivedFcn(u,~) 

        datagram = fscanf(u);
        disp('Data Received!');


        myBuffer{end+1} = datagram;         %Appends datagram to buffer


        [~, bufflen] = size(myBuffer);

        if bufflen < MAXBUFFLEN
            return;
        else
            f = parfeval(pool, @ProcessData, 1, myBuffer);
            myBuffer = {};               %empty Buffer
        end 

    end

    function ErrorFcn(u,~) 
        disp("An Error occured");
    end

end

function datagram_values = ProcessData(myBuffer)


    stringvalues = split(myBuffer, ";");        %Split Strings
    doublevalues = str2double(stringvalues)     %Convert Strings do Doubles

    dim_doublevalues = size(doublevalues);      %Dimension of Double Output Array

    i_max = dim_doublevalues(2)                 %Anzahl der Datenpakete
    j_max = (dim_doublevalues(3))-1             %Anzahl der Werte pro Datenpaket; -1 wegen leerem Wert nach ";" am Ende
    k_max = i_max*j_max                         %Gesamtanzahl der Werte in Buffer

    k=1;
    while k<=k_max
        for i = 1:i_max
            for j = 1:j_max
                    datagram_values(k,1)=doublevalues(1,i,j);
                    k=k+1;
            end
        end
    end

    disp(datagram_values);


end
功能读取电压
%%指定端口为8080的服务器(主机名或IP地址)
u=udp('192.168.0.164',8080);%UDP对象祖豪斯
%u=udp('169.254.38.221',8080);%UDP对象Pilotfabrik
%封闭函数中的缓冲区
myBuffer={};%初始化
MAXBUFFLEN=100;%Maximale Anzahl缓冲区中的EINTRAGEN(1 Eintrage=1数据报)
u、 InputBufferSize=4060;
u、 ReadAsyncMode='continuous';
u、 DatagramReceivedFcn=@DatagramReceivedFcn;
u、 ErrorFcn=@ErrorFcn;
u、 DatagramTerminateMode=
u、 终结者='!';
%%初始化并行池
pool=gcp();
%%韦宾登酒店
福彭(u);
如果(~strcmp(u.Status,'open'))
网络错误(u,“连接失败!”);
结束
%%通过触发器启动数据传输
fprintf(u,‘请求数据’)
%%回调函数
函数DatagramReceivedFcn(u,~)
数据报=fscanf(u);
disp('接收数据!');
myBuffer{end+1}=数据报;%将数据报附加到缓冲区
[~,bufflen]=大小(myBuffer);
如果bufflen不幸的是,MATLAB调试器无法停止在workers上运行的代码,而workers是在客户端运行的纯代码

在这种情况下,您应该尝试查看未来
f
的日志输出,如下所示:

f = parfeval(...);
wait(f); % wait for the worker to complete
disp(f.Diary); % display the output
f = parfeval(...);
afterEach(f, @(f) disp(f.Diary), 0, 'PassFuture', true);
如果不希望阻止客户端,可以使用调用
disp
,如下所示:

f = parfeval(...);
wait(f); % wait for the worker to complete
disp(f.Diary); % display the output
f = parfeval(...);
afterEach(f, @(f) disp(f.Diary), 0, 'PassFuture', true);

非常感谢你!这就解释了断点不起作用的原因。当我收到f.Diary的预期输出时,我假设我的函数按预期工作。因此,如果我想在ProcessData函数的末尾包含sqlwrite语句,它应该在我的程序继续接收UDP数据报时处理数据并将其写入数据库,对吗?(不使用wait(f)和disp(f.Diary))是的,无论在工人身上发生了什么,都将继续并让客户自由。如果您想让每个工作人员都保持一个持久的数据库连接(有关详细信息,请参阅文档页),那么接下来您可能希望查看
parallel.pool.Constant
。感谢您的支持!我将查看它,但可能还不需要它,因为所有数据都应该写入一个数据库:)另一个问题:如果我的parfeval函数在下一个缓冲区传递给函数之前没有完成对myBuffer中数据的处理,它会直接分发给池中其他12个工作区中的一个吗?如果不是,那么避免这种情况的最佳做法是什么呢?
parfeval
请求将在可用的工作线程上并行运行,并按照调用
parfeval
的顺序发送给工作线程。