Programátorská sociální síť a materiálová základna pro C#, Java, PHP, HTML, CSS, JavaScript a další.

Přihlásit se Registrace  
Zveme vás v pátek na sraz komunity devbooku.
22.05.2012 17:01:07
Avatar
Fugiczek
Redaktor
DotDotDotDotDotDotDotDotDotDot

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...");
     }
22.05.2012 17:27:35
Avatar
matesax
Redaktor
DotDotDotDotDotDotDotDotDotDot

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

22.05.2012 17:38:11
Avatar
Fugiczek
Redaktor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na matesax

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

22.05.2012 17:46:45
Avatar
matesax
Redaktor
DotDotDotDotDotDotDotDotDotDot

Tak ji hoď sem,... :)

22.05.2012 17:47:45
Avatar
matesax
Redaktor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na Fugiczek

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

22.05.2012 17:52:22
Avatar
Fugiczek
Redaktor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na matesax

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;
     }
 }
22.05.2012 18:00:48
Avatar
matesax
Redaktor
DotDotDotDotDotDotDotDotDotDot

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

22.05.2012 18:06:16
Avatar
Fugiczek
Redaktor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na matesax

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

22.05.2012 18:09:27
Avatar
matesax
Redaktor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na Fugiczek

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

22.05.2012 18:10:01
Avatar
matesax
Redaktor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na Fugiczek

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

22.05.2012 20:09:55
Avatar
Fugiczek
Redaktor
DotDotDotDotDotDotDotDotDotDot

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

22.05.2012 20:23:27
Avatar
David Čápka
Moderátor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na Fugiczek

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   i++; | i--;
Metal is the transitional element for the construction of Artifact Vessels.
22.05.2012 20:23:33
Avatar
matesax
Redaktor
DotDotDotDotDotDotDotDotDotDot

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

Asi bude chyba ve funkci pis.

22.05.2012 20:33:21
Avatar
Fugiczek
Redaktor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na David Čápka

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

22.05.2012 20:39:39
Avatar
David Čápka
Moderátor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na Fugiczek

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   i++; | i--;
Metal is the transitional element for the construction of Artifact Vessels.
22.05.2012 20:48:09
Avatar
Fugiczek
Redaktor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na David Čápka

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

22.05.2012 20:57:04
Avatar
Fugiczek
Redaktor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na 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áží :)

23.05.2012 10:42:45
Avatar
David Čápka
Moderátor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na Fugiczek

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   i++; | i--;
Metal is the transitional element for the construction of Artifact Vessels.
23.05.2012 19:23:48
Avatar
Fugiczek
Redaktor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na David Čápka

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

 

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.