首页 \ 问答 \ 使用显示器的Writer / Reader不工作(Writer/Reader using Monitor not working)

使用显示器的Writer / Reader不工作(Writer/Reader using Monitor not working)

我正在做一个任务,在哪里实现一个使用监视器进行同步的Writer / Reader问题。

场景:作者应该从列表中一次一个地写入一个字符串到缓冲区中(缓冲区一次只能保存一个字符串)。 然后阅读器应该从缓冲区中读取字符串,并在打印之间暂停0.5秒后在gui中打印字符串。 该程序使用一个单独的编写器线程和一个单独的读取器线程,当gui中的一个按钮被按下时,这些线程同时启动。

我的问题是:我无法使同步工作,读者只需每0.5秒输出一个空值(这意味着当阅读器试图从中读取时缓冲区很可能是空的)。 我设法发现一个错误:作家没有达到try buffer.put(text.get(i)) ,尽管我找不出原因。

任何人可以帮助? 非常感激! 我的代码在下面,希望它够了,我不想垃圾太多的代码。 (我也很喜欢Writer / Reader问题,但已经阅读了一些编码示例等)

作家:

public void run() {
    buffer.length(text.size());
    for (int i = 0; i < text.size(); i++) { //loops thorugh the list of strings
        System.out.println("hj"); //reaches this
        try {
            buffer.put(text.get(i)); //put the string into the buffer
            System.out.println("put done"); // never reaches this
            sleep(); //pauses the thread for 0.5 seconds
        } catch (InterruptedException e) {
            System.out.println("error"); //never reaches this either
            e.printStackTrace();
        }
    }
}

缓冲:

/**
 * gets a string from the writer
 * @throws InterruptedException 
 */
public synchronized void put(String string) throws InterruptedException {
    while(hasString == false) { //we only want to put a string into the buffer if it is empty
        wait();
        this.string = string;
        hasString = true;
        notify();
    }
}

/**
 * passes on a string to the reader
 * @throws InterruptedException 
 */
public synchronized String get() throws InterruptedException {
    while(hasString == true) { //we only want to pass on a string if the buffer is NOT empty
        wait();
        hasString = false;
        notify();
    }
    return string;
}

读者:

/**
 * reads a string from the buffer and writes it to the gui in the destination-tab
 */
public void run() {
    for (int i  = 0; i < buffer.getLength(); i++) { //loops through the length of the list with strings
        try {
            string = buffer.get(); //gets string from buffer
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
        //writes the string in the gui
        sb.append(string);
        GUIMonitor.txtPaneDest.setText(sb.toString());
        try {
            sleep(); //pauses the thread for 0.5 seconds
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

I´m doing an assignment where are implementing a Writer/Reader problem that uses a monitor for synchronization.

The scenario: The writer should write a string from a list one at a time into a buffer (the buffer can only hold one single string at a time). The reader should then read the string from the buffer and print the string in a gui with a 0.5 second pause between the prints. The program uses one singular writer-thread and one singular reader-thread, which are started simultaneously when a button in the gui is pressed.

My problem: I cannot get the synchronization to work, the reader just prints out null every 0.5 seconds (which means the buffer is most likely empty when the reader tries to read from it). I managed to find an error: the writer is not reaching the try where buffer.put(text.get(i)), though I cannot figure out why.

Anyone who could help?? Much appreciated! My code is down below, hope it is enough, I don´t want to spam too much code. (I´m also pretty new with the Writer/Reader problem but have read some coding examples etc.)

Writer:

public void run() {
    buffer.length(text.size());
    for (int i = 0; i < text.size(); i++) { //loops thorugh the list of strings
        System.out.println("hj"); //reaches this
        try {
            buffer.put(text.get(i)); //put the string into the buffer
            System.out.println("put done"); // never reaches this
            sleep(); //pauses the thread for 0.5 seconds
        } catch (InterruptedException e) {
            System.out.println("error"); //never reaches this either
            e.printStackTrace();
        }
    }
}

Buffer:

/**
 * gets a string from the writer
 * @throws InterruptedException 
 */
public synchronized void put(String string) throws InterruptedException {
    while(hasString == false) { //we only want to put a string into the buffer if it is empty
        wait();
        this.string = string;
        hasString = true;
        notify();
    }
}

/**
 * passes on a string to the reader
 * @throws InterruptedException 
 */
public synchronized String get() throws InterruptedException {
    while(hasString == true) { //we only want to pass on a string if the buffer is NOT empty
        wait();
        hasString = false;
        notify();
    }
    return string;
}

Reader:

/**
 * reads a string from the buffer and writes it to the gui in the destination-tab
 */
public void run() {
    for (int i  = 0; i < buffer.getLength(); i++) { //loops through the length of the list with strings
        try {
            string = buffer.get(); //gets string from buffer
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
        //writes the string in the gui
        sb.append(string);
        GUIMonitor.txtPaneDest.setText(sb.toString());
        try {
            sleep(); //pauses the thread for 0.5 seconds
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

原文:https://stackoverflow.com/questions/47968345
更新时间:2023-05-17 12:05

最满意答案

正如他们的名字所暗示的, UIVideoAtPathIsCompatibleWithSavedPhotosAlbum()UISaveVideoAtPathToSavedPhotosAlbum()方法UIVideoAtPathIsCompatibleWithSavedPhotosAlbum()一个路径 ,而不是一个URL。 不是一回事。

字符串

file:///private/var/mobile/Containers/Data/Application/.../filename.mov

是一个URL ,由该方案组成

file://

路径

/private/var/mobile/Containers/Data/Application/.../filename.mov

传递完整的URL时,设计为接受路径的函数将无法正常工作。

要解决该问题,请使用videoURL.path替换对videoURL.absoluteString调用。


As their names suggest, the methods UIVideoAtPathIsCompatibleWithSavedPhotosAlbum() and UISaveVideoAtPathToSavedPhotosAlbum() expect a path, not a URL. Not the same thing.

The string

file:///private/var/mobile/Containers/Data/Application/.../filename.mov

is a URL, composed of the scheme

file://

and path

/private/var/mobile/Containers/Data/Application/.../filename.mov

A function designed to accept a path will not work correctly when passed a complete URL.

To solve the problem, replace calls to videoURL.absoluteString with videoURL.path.

相关问答

更多

相关文章

更多

最新问答

更多
  • 如何使用自由职业者帐户登录我的php网站?(How can I login into my php website using freelancer account? [closed])
  • 如何打破按钮上的生命周期循环(How to break do-while loop on button)
  • C#使用EF访问MVC上的部分类的自定义属性(C# access custom attributes of a partial class on MVC with EF)
  • 如何获得facebook app的publish_stream权限?(How to get publish_stream permissions for facebook app?)
  • 如何并排放置两个元件?(How to position two elements side by side?)
  • 在MySQL和/或多列中使用多个表用于Rails应用程序(Using multiple tables in MySQL and/or multiple columns for a Rails application)
  • 如何隐藏谷歌地图上的登录按钮?(How to hide the Sign in button from Google maps?)
  • Mysql左连接旋转90°表(Mysql Left join rotate 90° table)
  • 带有ImageMagick和许多图像的GIF动画(GIF animation with ImageMagick and many images)
  • 电脑高中毕业学习去哪里培训
  • 电脑系统专业就业状况如何啊?
  • IEnumerable linq表达式(IEnumerable linq expressions)
  • 如何在Spring测试中连接依赖关系(How to wire dependencies in Spring tests)
  • Solr可以在没有Lucene的情况下运行吗?(Can Solr run without Lucene?)
  • 如何保证Task在当前线程上同步运行?(How to guarantee that a Task runs synchronously on the current thread?)
  • 在保持每列的类的同时向数据框添加行(Adding row to data frame while maintaining the class of each column)
  • 的?(The ? marks in emacs/haskell and ghc mode)
  • 一个线程可以调用SuspendThread传递自己的线程ID吗?(Can a thread call SuspendThread passing its own thread ID?)
  • 延迟socket.io响应,并“警告 - websocket连接无效”(Delayed socket.io response, and “warn - websocket connection invalid”)
  • 悬停时的图像转换(Image transition on hover)
  • IIS 7.5仅显示homecontroller(IIS 7.5 only shows homecontroller)
  • 没有JavaScript的复选框“关闭”值(Checkbox 'off' value without JavaScript)
  • java分布式框架有哪些
  • Python:填写表单并点击按钮确认[关闭](Python: fill out a form and confirm with a button click [closed])
  • PHP将文件链接到根文件目录(PHP Linking Files to Root File Directory)
  • 我如何删除ListView中的项目?(How I can remove a item in my ListView?)
  • 您是否必须为TFS(云)中的每个BUG创建一个TASK以跟踪时间?(Do you have to create a TASK for every BUG in TFS (Cloud) to track time?)
  • typoscript TMENU ATagParams小写(typoscript TMENU ATagParams lowercase)
  • 武陟会计培训类的学校哪个好点?
  • 从链接中删除文本修饰(Remove text decoration from links)