Facebook RSS feed
Zveme vás v pátek 31.10. na vánoční sraz komunity itnetwork.
Avatar
Fugiczek
Redaktor
Avatar
Fugiczek:

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
Avatar
matesax
Redaktor
Avatar
matesax:

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

 
Odpovědět 22.5.2012
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na matesax
Fugiczek:

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

 
Odpovědět 22.5.2012
Avatar
matesax
Redaktor
Avatar
matesax:

Tak ji hoď sem,... :)

 
Odpovědět 22.5.2012
Avatar
matesax
Redaktor
Avatar
Odpovídá na Fugiczek
matesax:

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

 
Odpovědět 22.5.2012
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na matesax
Fugiczek:

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;
     }
 }
 
Odpovědět 22.5.2012
Avatar
matesax
Redaktor
Avatar
matesax:

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,...

 
Odpovědět 22.5.2012
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na matesax
Fugiczek:

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 :)

 
Odpovědět 22.5.2012
Avatar
matesax
Redaktor
Avatar
Odpovídá na Fugiczek
matesax:

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

 
Odpovědět 22.5.2012
Avatar
matesax
Redaktor
Avatar
Odpovídá na Fugiczek
matesax:

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

 
Odpovědět 22.5.2012
Avatar
Fugiczek
Redaktor
Avatar
Fugiczek:

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 :)

 
Odpovědět 22.5.2012
Avatar
David Čápka
Moderátor
Avatar
Odpovídá na Fugiczek
David Čápka:

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

Odpovědět 22.5.2012
Metal is the transitional element for the construction of Artifact Vessels.
Avatar
matesax
Redaktor
Avatar
matesax:

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

Asi bude chyba ve funkci pis.

 
Odpovědět 22.5.2012
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na David Čápka
Fugiczek:

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 :)

 
Odpovědět 22.5.2012
Avatar
David Čápka
Moderátor
Avatar
Odpovídá na Fugiczek
David Čápka:

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.

Odpovědět 22.5.2012
Metal is the transitional element for the construction of Artifact Vessels.
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na David Čápka
Fugiczek:

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 :(

 
Odpovědět 22.5.2012
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na Fugiczek
Fugiczek:

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áží :)

 
Odpovědět 22.5.2012
Avatar
David Čápka
Moderátor
Avatar
Odpovídá na Fugiczek
David Čápka:

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.

Odpovědět 23.5.2012
Metal is the transitional element for the construction of Artifact Vessels.
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na David Čápka
Fugiczek:

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

 
Odpovědět 23.5.2012

 

Zobrazeno 19 z 19 zpráv

Přidat novou zprávu

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řihlaš. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.