forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Программирование (http://forum.boolean.name/forumdisplay.php?f=54)
-   -   Синхронизация тредов (http://forum.boolean.name/showthread.php?t=14435)

Doctor Drive 17.03.2011 17:15

Синхронизация тредов
 
У меня есть поток канвасный, в котором прорисовываеться консоль, но консоль не успевает.
Нужно сделать чтобы тред из которого вызываеться действие в консоли подождал пока консоль прорисует.




Ситуация такая.


Session.java

Код:

    Main.main.log.write("HTTP " + responsecode + " " + net.getResponseMessage(), obj);
    //TODO: тут надо подождать пока там прорисует


Log.java:

Код:

    public void write(String tex) {    //этот метод мы вызываем
        if ((tex != null) && (!tex.equals(""))) {
            action = true; //чтобы установить флажок на рсование
            synchronized(texts) {
                texts.addElement(tex); //и добавить в очередь что надо написать
            } //TODO избавиться очереди.
        }
    }

Код:

    public void run() {
        while (true) {
            try {
                Thread.sleep(10);
            }
            catch (InterruptedException ie) { }
            if (action) repaint();
        }

    }

Код:

    public void paint(Graphics g) {
        if (action) {
            //рисуем
            action = false;
        }
    }


Doctor Drive 17.03.2011 18:38

Ответ: Синхронизация тредов
 
Попробовал так:

Класс Main

Код:

    public void wait1() {
        while (true) {
            try { Thread.sleep(10); }
            catch (Exception e) {}
            synchronized(log.texts) {
                if (log.texts.size() == 0) break; //так как когда оно все закончит, вектор будет пуст
            }
        }
    }


И с любого класса, когда прорисовываем, сразу заходим в метод ждалки
Код:

            Main.main.log.write(path);
            Main.main.wait1();

И получаем deadlock...

Жека 30.03.2011 07:07

Ответ: Синхронизация тредов
 
Самое простое - использовать "связку" из двух команд

Код:

repaint();
serviceRepaint();



Часовой пояс GMT +4, время: 12:42.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot