天下寒士 2023-02-17 23:13 采纳率: 83.3%
浏览 72
已结题

matlab怎么在两个同时允许的m文件中读取同一个txt文件的内容

在学习深度学习的过程中,想要实现图像识别和串口输出分别进行,也就是两个循环。这样输出不会影响图像识别的效率。
(实测在串口外接一个设备,如果把串口输出信息的代码写在图像识别的循环里,如果输出边出现信号传递的延迟,那么会造成图像识别的卡顿)

一个循环while不停进行帧数获取,并且识别得到结果,把对应的结果输出在一个txt文件中;
另一个循环while通过if分析得到的识别结果,并且对应不同串口输出信息。

例如

 if label=='红'
                        c = 2;
                    end
                  
                    cd('c:\picture\');
                    fopen('memory.txt','w');
                    awrite = fopen('memory.txt','w');
                    fprintf(awrite,'%4.0f',c);
(以上为:当识别为红时,在memory.txt中记录3,若识别为其他时,将3替换记录为其他的值,实时刷新)

以下为多开的第二个matlab中运行的代码:


while 1
              
                c = load("memory.txt");
                if c == 2
                    fwrite(s,dataA,"uint8");

                end
            end

但是这样做,会报错以下:

现在无法访问以前可访问的文件
"K:\matlab\toolbox\matlab\parallel+parallel+internal+pool\isPoolWorker.m"。

经过多次测试,应该是两个循环同时读取到memory.txt文件所致。

故有什么办法或者函数,能让二者同时读取这个文件,或者有其他隔离图像识别和输出的好办法吗

  • 写回答

9条回答 默认 最新

  • 社区专家-Monster-XH 2023-02-17 23:26
    关注

    基于Monster 组和GPT的调写:
    用 MATLAB 的 FileLock 函数,它可以确保同一时刻只有一个进程能够访问文件,从而解决两个循环同时读取同一个文件的问题。示例:
    循环1:将结果写入 memory.txt

    while true
        % 检测是否有其他进程正在访问文件
        while exist('memory.txt.lock', 'file') == 2
            pause(0.1);
        end
    
        % 创建文件锁
        filelock = fopen('memory.txt.lock', 'w');
        fclose(filelock);
    
        % 写入结果到文件
        if label == '红'
            c = 2;
        end
        dlmwrite('memory.txt', c, '');
    
        % 删除文件锁
        delete('memory.txt.lock');
    
        % 等待一段时间,让其他进程有机会访问文件
        pause(0.1);
    end
    
    
    

    循环2:从 memory.txt 读取结果

    while true
        % 检测是否有其他进程正在访问文件
        while exist('memory.txt.lock', 'file') == 2
            pause(0.1);
        end
    
        % 创建文件锁
        filelock = fopen('memory.txt.lock', 'w');
        fclose(filelock);
    
        % 从文件中读取结果
        c = dlmread('memory.txt');
    
        % 删除文件锁
        delete('memory.txt.lock');
    
        % 根据结果输出信息
        if c == 2
            fwrite(s, dataA, 'uint8');
        end
    
        % 等待一段时间,让其他进程有机会访问文件
        pause(0.1);
    end
    
    
    

    用了 exist 函数来检测文件是否被锁定,使用了 dlmwrite 和 dlmread 函数来写入和读取文件内容,使用了 delete 函数来删除文件锁。为了避免两个进程同时访问文件,我们在访问文件之前创建了一个文件锁(即 memory.txt.lock 文件),并在访问文件之后立即删除该文件锁。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(8条)

报告相同问题?

问题事件

  • 系统已结题 3月2日
  • 已采纳回答 2月22日
  • 修改了问题 2月17日
  • 创建了问题 2月17日

悬赏问题

  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程