缓存溢出 matlab,matlab - matlab bytesAvailableCallback带有空缓冲区 - 堆栈内存溢出

在MATLAB中使用UDP客户端时,设置BytesAvailableFcn回调会导致当输入缓冲区为空时仍被多次调用。这可能导致性能问题。博客探讨了如何处理这种行为,尤其是当回调在输入缓冲区为空时依然被触发的情况,以及如何减少不必要的回调调用以优化程序性能。
摘要由CSDN通过智能技术生成

在matlab中打开任何通讯工具时,可以使用BytesAvailableFcn设置对象。 即u.BytesAvailableFcn = @bytesAvailable_callback;

每次调用回调时,它将完全清除缓冲区。 例如,对于udp客户端:

function bytesAvailable_callback(udp_obj, event)

bytesAvailable = get(udp_obj, 'BytesAvailable');

fprintf('callback - bytesAvailable = %d\n',bytesAvailable);

while bytesAvailable

data = fread(udp_obj, bytesAvailable, 'int32');

fprintf('rec = %d\n',data(1));

bytesAvailable = get(udp_obj, 'BytesAvailable');

end

end

接下来发生的问题是问题:缓冲区已被清除,但BytesAvailableFcn仍在调用堆栈中,将被调用很多次,仅不返回任何内容。

使用udp运行上述回调的示例:

clc

echoudp('on', 8000)

%

u = udp('127.0.0.1', 8000);

u.OutputBufferSize = 10000;

u.InputBufferSize = 10000;

u.BytesAvailableFcn = @bytesAvailable_callback;

u.BytesAvailableFcnCount = 10;

u.BytesAvailableFcnMode = 'byte';

fopen(u);

%

for i = 1:2

fprintf('send = %d\n',i );

fwrite(u, [i ones(1,10)], 'int32');

end

pause(1)

%%

fclose(u);

delete(u);

clear u

echoudp('off');

结果是:

send = 1

send = 2

callback - bytesAvailable = 88

rec = 1

rec = 2

callback - bytesAvailable = 0

callback - bytesAvailable = 0

callback - bytesAvailable = 0

callback - bytesAvailable = 0

callback - bytesAvailable = 0

callback - bytesAvailable = 0

callback - bytesAvailable = 0

我们可以轻松地看到有害的行为-InputBuffer为空时调用的回调。 在繁忙的程序中,上面的要求可能非常高,每个回调都很重要。 有没有一种方法可以“刷新”上述不需要的回调调用?

使用drawow并没有帮助-它执行了回调,因此仍然可以访问该函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值