IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Fugiczek
Tvůrce
Avatar
Fugiczek:22.5.2012 17:01

Mam takovy problem. Pisu si bota pro jednu aplikaci, ale to je vedlejsi. Mam textak se seznamem slov (ty slova pak budu prepisovat do prohlizecu) no a kdyz chcu cist to slovo tak proste to hodi chybu a nevím cim by to mohlo být.
Tady je vlakno na cteni:

 import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;

import javax.swing.JOptionPane;

public class Ctecka extends Thread{
        FileReader fr;
        BufferedReader br;
        String jmenoSouboru;
        static public boolean hotovo=false;

        Ctecka(String jmeno){
                super("Cteni textaku");
                jmenoSouboru=new String(jmeno);
        }
        public void run(){
                String slovo;
                try{
                        fr=new FileReader(jmenoSouboru);
                        br=new BufferedReader(fr);
                        while((slovo=br.readLine())!=null){
                                slovo=br.readLine();

Thread.yield();
                        }
                        fr.close();
                        hotovo=true;
                }
                catch(IOException e){
                        JOptionPane.showMessageDialog(null, "Vyskytla se chyba pri cteni", "Chyba cteni", JOptionPane.ERROR_MESSAGE);
                        hotovo=true;
                }
        }
        public void stopp(){
                hotovo=true;
        }
        public void ready(){
                hotovo=false;
        }
}

A tady ho zapinam + k tomu pripojuji druhy vlakno: (b je vlakno bota a c je vlakno ctecky, jen pro zorientovani =))

private void zapnuti(){
        b.vypni();
        b.zapni();
        c.stopp();
        c.ready();
        //prasacky vyreseni chyby :D
        try{
            c.start();
            b.join();
        }
        catch(Exception e){
                log.append(RADKA + "Nejaka chybka :D");
        }
        log.append(RADKA + "Bot zapnut...");
    }
 
Odpovědět
22.5.2012 17:01
Avatar
matesax
Tvůrce
Avatar
matesax:22.5.2012 17:27

Kde a jaký error ti to hlásí?

 
Nahoru Odpovědět
22.5.2012 17:27
Avatar
Fugiczek
Tvůrce
Avatar
Odpovídá na matesax
Fugiczek:22.5.2012 17:38

No nechal jsem si chybu vypsat prikazem

e.getLocalizedMessage()

takze problem byl ve spatnem umisteni souboru, moje chyba ze jsem si toho nevsimnul.
Jenze ted se objevila jina chyba a to takova ze mi nejak nejede vlakno s botem o_O

 
Nahoru Odpovědět
22.5.2012 17:38
Avatar
matesax
Tvůrce
Avatar
matesax:22.5.2012 17:46

Tak ji hoď sem,... :)

 
Nahoru Odpovědět
22.5.2012 17:46
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Fugiczek
matesax:22.5.2012 17:47

Na kontrolu chyb je skvělý Notepad++ - když stáhneš pár vychytávek.

 
Nahoru Odpovědět
22.5.2012 17:47
Avatar
Fugiczek
Tvůrce
Avatar
Odpovídá na matesax
Fugiczek:22.5.2012 17:52

No ono to neni chyba, proste se to vlakno nezapne a nevykona to ty veci ktery ma.
Jinak me staci Eclipse ten me buzeruje furt :D
Jinak vlakno bota(klikani zatim provizorni):

import java.awt.Robot;
import java.awt.AWTException;
import java.awt.event.InputEvent;
import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.JOptionPane;

public class Bot extends Thread{
    int width; //sirka rozliseni
    int height; //vyska rozliseni
    String slovo; //slovo na surf
    boolean stop;
    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
    public Bot(){
        super("MBCBot");
        this.width=dim.width;
        this.height=dim.height;
    }

    public void run(){
        while(!stop){
            try{
                Robot robot=new Robot();
                slovo=Ctecka.slovo;

                robot.delay(1000);
                //kliknuti na reklamu
                robot.mouseMove(width-286,height-243);
                robot.mousePress(InputEvent.BUTTON1_MASK);
                robot.mouseRelease(InputEvent.BUTTON1_MASK);
                robot.delay(5000);
                //vypnuti okna
                robot.mouseMove(386,12);
                robot.mousePress(InputEvent.BUTTON1_MASK);
                robot.mouseRelease(InputEvent.BUTTON1_MASK);
                //schovani prohlizece
                robot.mouseMove(1280,10);
                robot.mousePress(InputEvent.BUTTON1_MASK);
                robot.mouseRelease(InputEvent.BUTTON1_MASK);
            }
            catch(AWTException e){
                JOptionPane.showMessageDialog(null, "Vyskytla se chyba pri cinnosti bota", "Chyba bota", JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    public void zapni(){
        stop=false;
    }

    public void vypni(){
        stop=true;
    }
}
 
Nahoru Odpovědět
22.5.2012 17:52
Avatar
matesax
Tvůrce
Avatar
matesax:22.5.2012 18:00

Nejsem si jistý který bool je defalutní - takže zkus nenechávat prázdný konstruktor ale dej boolean stop = true; Nejspíš to tím ale nebude,...

 
Nahoru Odpovědět
22.5.2012 18:00
Avatar
Fugiczek
Tvůrce
Avatar
Odpovídá na matesax
Fugiczek:22.5.2012 18:06

Uz jsem to vyresil, stacilo trochu zapremyslet, jsem ve vlaknech uz dlouho nedelal.
Do vlakna s botem se prida

Thread.yield();

A do tridy s GUIckem do metody kde to zapinam, prepisu misto tohoto

b.join();

na

b.start();

Diky za pomoc, bez tvych pripominek bych se k tomu nedostal :)

 
Nahoru Odpovědět
22.5.2012 18:06
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Fugiczek
matesax:22.5.2012 18:09

No právě - tam kde se chyba projevuje nemusí být problém,... :)

 
Nahoru Odpovědět
22.5.2012 18:09
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Fugiczek
matesax:22.5.2012 18:10

Není zač - ať nejsem nezdvořák. :)

 
Nahoru Odpovědět
22.5.2012 18:10
Avatar
Fugiczek
Tvůrce
Avatar
Fugiczek:22.5.2012 20:09

Takze dalsi 2 chybky :D

1. nefunguje mi metoda na napsani slova, macka si to uplne divny klavesy

void pis(String slovo){
        int pismeno;
        char znak;
        for(int i=0;i<slovo.length();i++){
                znak=slovo.charAt(i);
                Character.toUpperCase(znak);
                pismeno=(int)znak;
                robot.keyPress(pismeno);
                robot.keyRelease(pismeno);
        }
    }

2. nepredava se mi slovo z vlakna
tady by to melo teoreticky predat beh dalsimu vlaknu i s tim ze v promene slovo neco je nacteny

while((slovo=br.readLine())!=null){
                                slovo=br.readLine();
                                Thread.yield();
                        }

jenze tady uz to predava velky kulovi

slovo=Ctecka.slovo;
               if(slovo!=null){
                       pis(slovo);
               }

Dekuji za pripadne rady :)

 
Nahoru Odpovědět
22.5.2012 20:09
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Fugiczek
David Hartinger:22.5.2012 20:23

Nechal bych si vypsat, co je v tom pismeno, ale ten kód vypadá docela dobře, funguje určitě to keyPress?

Nahoru Odpovědět
22.5.2012 20:23
New kid back on the block with a R.I.P
Avatar
matesax
Tvůrce
Avatar
matesax:22.5.2012 20:23

Slovo si prvně vytáhni do veřejné proměnné.
http://www.roseindia.net/…charat.shtml

Asi bude chyba ve funkci pis.

 
Nahoru Odpovědět
22.5.2012 20:23
Avatar
Fugiczek
Tvůrce
Avatar
Odpovídá na David Hartinger
Fugiczek:22.5.2012 20:33

Díky, bralo to ASCII hodnotu maleho pismene, nevim proc kdyz to pismeno zvetsuji ale nevadi, staci odecitat 32. Ted jen vyresit proc mi to nebere slova z toho vlakna :)

 
Nahoru Odpovědět
22.5.2012 20:33
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Fugiczek
David Hartinger:22.5.2012 20:39

To načítání je nějaké dost divné teda. Ve while načítáš do slovo již v podmínce a potom znovu v těle, to voláš to readLine 2x a čteš 2 řádky v jedné iteraci.

Null máš ve slovo proto, že se tam dosadí při načtení poslední řádky. Co mát ten kód dělat? Tvůj kód projede po dvou řádkách celý soubor a pak vrátí null.

Nahoru Odpovědět
22.5.2012 20:39
New kid back on the block with a R.I.P
Avatar
Fugiczek
Tvůrce
Avatar
Odpovídá na David Hartinger
Fugiczek:22.5.2012 20:48

Tak kdyz to dam takhle:

while((slovo=br.readLine())!=null){
                                Thread.yield();

tak to nacte radek do promenne, preda beh vlaknu dalsimu, to vlakno to slovo zpracuje a zase preda beh 1. vlaknu aby precetlo dalsi radek
aspon takhle si myslim ze to funguje :(

 
Nahoru Odpovědět
22.5.2012 20:48
Avatar
Fugiczek
Tvůrce
Avatar
Odpovídá na Fugiczek
Fugiczek:22.5.2012 20:57

Tak posledni problem vyresen, ono to ty slova precetlo driv nez to nekdo stacil zpracovat, tak jsem tam dal uspani aby to stihlo udelat vsechny nasledne kroky =))
Takze opet dekuji za pomoc, snad uz se zadne chyby neukáží :)

 
Nahoru Odpovědět
22.5.2012 20:57
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Fugiczek
David Hartinger:23.5.2012 10:42

A jsou ta vlákna opravdu nutná? Resp. děláš něco tak výkonnostně náročného, že potřebuješ využívat více jader? Nebo potřebuješ paralelní běh dvou procesů? Mě spíše přijde, že mezi vlákny neustále komunikuješ, vlákna jsou obecně velmi problémová a sahal bych k nim až v případě, že to jinak opravdu nejde.

Nahoru Odpovědět
23.5.2012 10:42
New kid back on the block with a R.I.P
Avatar
Fugiczek
Tvůrce
Avatar
Odpovídá na David Hartinger
Fugiczek:23.5.2012 19:23

Nic narocneho nedelam a ani neplanuji, dekuji za radu. Ani nevim proc me ty vlakna napadly, asi udelam mensi upravu kodu :)

 
Nahoru Odpovědět
23.5.2012 19:23
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 19 zpráv z 19.