Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Pobieranie linijek z tekstu po kolei,akcja,czekanie x sec i od nowa.


eXnR

Rekomendowane odpowiedzi

Opublikowano

Siema,

 

Potrzebuję zrobić takie coś: 

 

Program pobiera po kolei linijkę z tekstu, następnie wykonuje polecenie, czeka x czasu i od początku dopóki nie skończy się tekst w pliku. 

Zależy mi na tym żeby program się nie freezował (tak jak przy użyciu Thread.sleep) 

 

 

linki w górę

Opublikowano

ok, dzięki. A jak zrobić pobieranie linijek po kolei? Załadować plik do tablicy i pętla for? 

 

Edit:

Kurde, nie umiem tego zrobić :< . Może ktoś dać jakiś przykład? 

linki w górę

Opublikowano

Ok, dzięki. 

 

Wiesz może jeszcze jak rozwiązać ten błąd: 

Argument 2: cannot convert from 'System.Collections.Generic.List<string>' to 'string'

linki w górę

Opublikowano

 

Ok, dzięki. 

 

Wiesz może jeszcze jak rozwiązać ten błąd: 

Argument 2: cannot convert from 'System.Collections.Generic.List<string>' to 'string'

daj caly kod to bede w stanie ci pomoc

i powinienes poczytac o samych podstawach c# skoro nie jestes w stanie stwierdzic czemu masz taki blad .. ;x

3053080006.png

Opublikowano


List<String> EmL = new List<String>();

 

using (StreamReader sr = new StreamReader("email.txt"))

{

string line;

while ((line = sr.ReadLine()) != null)

{

EmL.Add(line);

}

}

 

 

HtmlElementCollection links = webBrowser1.Document.GetElementsByTagName("tx");

 

foreach (HtmlElement link in links)

{

link.SetAttribute("value", EmL);

}

 

linki w górę

Opublikowano

zamien

 

 foreach (HtmlElement link in links)
            {
                link.SetAttribute("value", EmL);
            }

na

 

for(int i=0; i<links.Length; i++)
    {
        links[i].SetAttribute("value", EmL[i]);
    }

i powinno dzialac

3053080006.png

Opublikowano


'System.Windows.Forms.HtmlElementCollection' does not contain a definition for 'Length' and no extension method 'Length' accepting a first argument of type 'System.Windows.Forms.HtmlElementCollection' could be found (are you missing a using directive or an assembly reference?)

 

 

linki w górę

Opublikowano

Moze pobiera ale nie podmienia bo masz za malo elementow "tx" ?

 

Mozesz tez sprobowac zmieniajac caly swoj kod na np:

 

    string[] EmL = System.IO.File.ReadAllLines("email.txt");
            
            HtmlElementCollection links = webBrowser1.Document.GetElementsByTagName("tx");
            
            for(int i=0; i<links.Count; i++)
            {
                links[i].SetAttribute("value", EmL[i]);
            }

ale to wychodzi na to samo..

3053080006.png

Opublikowano

Nie.. właśnie niby wszystko ok: wpisuje, kilka itd. Po prostu nie bierze następnej linijki tylko wpisuje cały czas tą samą.

linki w górę

Opublikowano

Chcesz wpisywac w jedno pole po kolei wszystkie wartosci z pliku email.txt

czy wyswietlic je naraz?

 

jezeli to 1sze to zmieniasz petle ..

 

for(int i=0; i<EmL.Length; i++)
            {
                links[i].SetAttribute("value", EmL[i]);
                Thread.Sleep(1000); // lub czas zmiany na kolejny w dowolny inny sposob
            }

3053080006.png

Opublikowano

To pierwsze. 

 

Ale:

Wartość '1' nie jest prawidłową wartością dla 'index'. Wartość 'index' powinna znajdować się w zakresie od 0 do 0.
Nazwa parametru: index

linki w górę

Opublikowano

 

for(int i=0; i<EmL.Length; i++)
            {
                links[0].SetAttribute("value", EmL[i]);
                Thread.Sleep(1000); // lub czas zmiany na kolejny w dowolny inny sposob
            }

3053080006.png

Opublikowano

pobiera i wyswietla wszystkie..

musisz ustalic ilu sekundowe maja byc odstepy miedzy zmianami i zatrzymywac kod w petli for ( chociazby Thread.Sleep() )

jesli tego nie zrobisz to kod wykona sie tak szybk oze bedzie to wygladac na to ze wyswietla tylko jedna wartosc

3053080006.png

Opublikowano

Mówiłem, żebyś użył timera, thread.sleep zatrzymuje cała aplikacje.

­

zatrzymuje watek w ktorym zostal uzyty nie cala aplikacje

i gdyby chcial uzyc timera i tak zatrzymalby aplikacje w petli while ( chce powtarzac wyswietlanie tych danych ) wiec jaka roznica?

w tym przypadku jest lepiej uzyc thread.sleep pod kazdym wzgledem ^.^ i prosciej i lepiej pod wzgledem optymalizacji

3053080006.png

Opublikowano

@srulian96 ale jak mam użyć w tym timera? Tak żeby odczekiwał np 3sec? Obecnie mam tak: 

        private void timer1_Tick(object sender, EventArgs e)
        {
            string[] EmL= System.IO.File.ReadAllLines("email.txt");


            HtmlElementCollection links = webBrowser1.Document.GetElementsByTagName("tx");

            for (int i = 0; i < EmL.Length; i++)
            {
                links[0].SetAttribute("value", EmL[i]);
                webBrowser1.Document.GetElementById("b1").InvokeMember("click");
            }


        }

Chciałem to zrobić jako oddzielny proces, ale widzę że webbrowser + thread to tylko dodatkowy problem..

 

Chciałem się jeszcze zapytać: jak zrobić żeby program wykonywał dalszą akcję kiedy już linijki się skończą? 

linki w górę

Opublikowano

zamykasz kod w if

 

if(timer1.elapsedMiliseconds > 3000 {
     HtmlElementCollection links = webBrowser1.Document.GetElementsByTagName("tx");

            for (int i = 0; i < EmL.Length; i++)
            {
                links[0].SetAttribute("value", EmL[i]);
                webBrowser1.Document.GetElementById("b1").InvokeMember("click");
            }
timer1.Restart();
}

EmL musi byc zmienna dostapena w calej klasie

Mniej-wiecej tak to ma wygladac nie mam teraz debuggera by sprawdzic czy jest w 100 % poprawnie

 

a co do ostatniego pytania to zalezy jaka akcje masz na mysli ^.^

bo np od klikniecia buttona masz obsluge zdarzen

a jezeli ma wykonywac kolejna metode poprostu dopisujesz ja nizej..

tak wiec nei zabardzo wiem co masz na mysli

 

w kazdym razie ja zamiast na timerze wolalbym zrobic kolejny task wykonujacy sie co 3sec i przy pomocy method invokera wykonywac operacje na webBrowserze

3053080006.png

Opublikowano

Oj, nie chciałem ciebie oznaczyć :rolleyes:  za szybko odpowiedź dałeś  :D

 

W każdym razie: chodzi mi o zwykłe kliknięcie w button. Tzn jeśli tekst "wyczerpał" się to idzie dalej (klika w button) i od nowa (czyli pętla while?). 

linki w górę

Opublikowano

chcesz by kliknal automatycznie jakis button w webBrowserze?

jesli tak to dodajesz poprostu odpowiednia linijke do kodu

 

a jesli chcesz by po twoim nacisnieciu buttona w aplikacji zaczynal od nowa to tworzysz button i w eventach dodajesz nowe zdarzenie onclick

i w nim to co ma sie wykonywac po nacisnieciu tego buttona

3053080006.png

Opublikowano

No ciekawe, wiesz tyle co nic. On nie używa oddzielnego wątku pod tą operacje, więc thread.sleep zatrzyma główny wątek, czyli też zfreezuje aplikację.

 

Event timer_tick wykona się po upłynięciu ustawionego przez ciebie czasu.

timer1.Restart();

Co ty za farfazony odstawiasz? Czy ty wiesz co ty w ogóle piszesz?

 

 

 

­

uzywal innego watku inaczej nie mialby problemow z webbrowserem

3053080006.png

Opublikowano

Wyjaśniając: Chciałem zrobić w oddzielnym wątku, ale po sypnięciu errorami szybko zrezygnowałem :v

 

 

 

W każdym razie: chodzi mi o zwykłe kliknięcie w button. Tzn jeśli tekst "wyczerpał" się to idzie dalej (klika w button) i od nowa (czyli pętla while?). 

Nie było pytania..

 

 

 

Ale i tak wychodzi na to że muszę robić oddzielny wątek? Bo i thread blokuje i 

 

 

i gdyby chcial uzyc timera i tak zatrzymalby aplikacje w petli while ( chce powtarzac wyswietlanie tych danych ) wiec jaka roznica?

 

 

 

 

Tak?

 

 

­

linki w górę

Opublikowano

 

Jeśli operacja zbytnio obciąży aplikację, to nie będziesz mógł nic zrobić na formie (brak odpowiedzi).

Będziesz musiał wykorzystać BackgroundWorker.­

http://www.dotnetperls.com/backgroundworker

W tej sytuacji BackgroundWorker wydaje się najlepszym rozwiązaniem. Tylko teraz jak to zastosować? Mógłbyś podać przykład? (Jak ja zrobiłem to aplikacja zaliczyła zwieche ;v) 

linki w górę

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...