MatLab: parfeval() 不调用函数
MatLab: parfeval() doesn't call function
我正在尝试接近实时地处理来自 UDP 服务器的数据。
为此,我编写了这个 MatLab 代码,用 UDP 数据报填充缓冲区并在我的 MatLab 函数的缓冲区已满 (myBuffer) 后处理数据(拆分字符串等)。
在处理数据的过程中(大约需要 0.9 秒)我需要继续接收数据并将它们存储在(现在)清空的缓冲区中。
我发现 "Parallel Computing Toolbox" 的 parfeval-Function 可能适合我的需要,因为我需要在后台使用 "ProcessData" 到 运行 的函数。
我遇到的问题是我无法做到 运行 因为 parfeval 函数没有进入我的函数 ProcessData。我通过在 ProcessData() 中设置断点来测试它,但程序永远不会停止。我是不是函数参数做错了什么?
这就是 MatLab 帮助所说的: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
不幸的是,MATLAB 调试器无法在工作程序的代码 运行 中停止 - 只能在客户端的代码 运行 中停止。
在这种情况下,您应该尝试查看未来 f
的日记输出,如下所示:
f = parfeval(...);
wait(f); % wait for the worker to complete
disp(f.Diary); % display the output
如果您不想阻止客户端,您可以使用 afterEach
来调用对 disp
的调用,如下所示:
f = parfeval(...);
afterEach(f, @(f) disp(f.Diary), 0, 'PassFuture', true);
我正在尝试接近实时地处理来自 UDP 服务器的数据。
为此,我编写了这个 MatLab 代码,用 UDP 数据报填充缓冲区并在我的 MatLab 函数的缓冲区已满 (myBuffer) 后处理数据(拆分字符串等)。
在处理数据的过程中(大约需要 0.9 秒)我需要继续接收数据并将它们存储在(现在)清空的缓冲区中。
我发现 "Parallel Computing Toolbox" 的 parfeval-Function 可能适合我的需要,因为我需要在后台使用 "ProcessData" 到 运行 的函数。
我遇到的问题是我无法做到 运行 因为 parfeval 函数没有进入我的函数 ProcessData。我通过在 ProcessData() 中设置断点来测试它,但程序永远不会停止。我是不是函数参数做错了什么?
这就是 MatLab 帮助所说的: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
不幸的是,MATLAB 调试器无法在工作程序的代码 运行 中停止 - 只能在客户端的代码 运行 中停止。
在这种情况下,您应该尝试查看未来 f
的日记输出,如下所示:
f = parfeval(...);
wait(f); % wait for the worker to complete
disp(f.Diary); % display the output
如果您不想阻止客户端,您可以使用 afterEach
来调用对 disp
的调用,如下所示:
f = parfeval(...);
afterEach(f, @(f) disp(f.Diary), 0, 'PassFuture', true);