Avatar billede nat Nybegynder
18. november 2008 - 11:40 Der er 7 kommentarer og
1 løsning

Læs url fra fil

Jeg har fået hjælp til dette: http://www.eksperten.dk/spm/853195

Nu vil jeg så gerne læse url'erne fra en tesktfil, således at jeg gør noget i denne stil:

StreamReader reader = new StreamReader(@"C:\url.txt");
            string line;
            string[] tekst;
           

            while (!reader.EndOfStream)
            {
                line = reader.ReadLine();
                tekst = line.Split('\"');
                url[0] = ???(første linie i tekstfilen)
                url[1] = ???(anden linie i tekstfilen)
                osv.
                osv.
           

                Thread thread = new Thread(new ThreadStart(this.thread));
                thread.Start();

               
               
            }

            reader.Close();



Er dette muligt? Hvordan?
Avatar billede aaberg Nybegynder
18. november 2008 - 11:46 #1
Et eksempel på hvordan det kan gøres, hvis hver URL er separeret med et linjeskift:

List<string> urlList = new List<string>();
using (FileStream stream = File.OpenRead(@"c:\temp\test.txt"))
{
    using (StreamReader reader = new StreamReader(stream))
    {
        while (reader.Peek() > 0)
        {
            urlList.Add(reader.ReadLine());
        }
        reader.Close();
    }
}
Avatar billede aaberg Nybegynder
18. november 2008 - 11:48 #2
Jeg er ikke helt sikker på at jeg forstår, hvorfor starte en tråd inde i din kode! Kan du forklare det, så jeg er sikker på jeg ikke misforstår noget.
Avatar billede mr_falle Nybegynder
18. november 2008 - 11:50 #3
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        string[] url;
        private delegate void change(string URL);
        WebBrowser browser = new WebBrowser();
        bool continue_ = true;


        private void ChangeUrl(string URL)
        {
            if (browser.InvokeRequired)
            {
                change d = new change(ChangeUrl);
                browser.Invoke(d, new object[] { URL });
            }
            else
            {
                    browser.Navigate(URL);
            }         
        }

        private void thread()
        {
            while (continue_)
            {
                for (int i = 0; i < url.Length; i++)
                {
                    ChangeUrl(url[i]);

                    System.Threading.Thread.Sleep(10000);
                }
            }           
        }

        public Form1()
        {
            InitializeComponent();
            browser = webBrowser1;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            url = null;

            StreamReader rdr = new StreamReader(@"c:\test.txt");

            string text = rdr.ReadToEnd();

            url = text.Split(Convert.ToChar(","));

            //browser.Navigate(url[0]);
            Thread thread = new Thread(new ThreadStart(this.thread));
            thread.Start();
        }
    }
}
Avatar billede aaberg Nybegynder
18. november 2008 - 12:09 #4
Jeg vil råde dig til ikke at bruge multithreading til noget så simpelt som dette. Ovenstående kode vil helt sikkert give problemer.

eksempelvis (med mindre jeg overser et eller andet) kan du ikke umiddelbart lukke programmet, da der ikke er noget der fortæller tråden at den skal stoppe. Så når du lukker dit program, vil det i værste fald ikke lukke før 10sek multipliceret med antal url'er. Dette er hvis formen altså ikke kaster en Exception, fordi Invoke() metoden kaldes på formen efter den er disposed.

Ovenstående kode gør verdens simpleste problem kompliceret. Hvorfor?

Kun brug multithreading der det er nødvendigt. Ovenstående kode kan gøres meget simplere med en Timer. Hvis man absolut vil bruge multithreading, bør man bruge en BackgroundWorker.
Avatar billede aaberg Nybegynder
18. november 2008 - 12:18 #5
Jeg vil mene dette er en bedre løsning. Koden går ud fra at du har trukket en WebBrowser og en Timer fra toolbox'en, ind på din form.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class urltest : Form
    {
        private List<string> urlList = new List<string>();
        int currentUrlIndex = 0;

        public urltest()
        {
            InitializeComponent();

            using (FileStream stream = File.OpenRead(@"c:\temp\test.txt"))
            {
                using (StreamReader reader = new StreamReader(stream))
                {
                    while (reader.Peek() > 0)
                    {
                        urlList.Add(reader.ReadLine());
                    }
                    reader.Close();
                }
            }

            timer1_Tick(this.timer1, EventArgs.Empty);
            timer1.Interval = 10000;
            this.timer1.Enabled = true;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            this.webBrowser1.Navigate(this.urlList[currentUrlIndex++]);
            if (currentUrlIndex >= urlList.Count)
                currentUrlIndex = 0;
        }
    }
}
Avatar billede mr_falle Nybegynder
18. november 2008 - 12:31 #6
aaberg_cc har ret, min kode er mere kompliceret, og den er ikke testet, men vil ihvertfald give fejl når programmet lukkes.

Og som han siger, er der ingen grund til at gøre det mere besværligt end det egentlig er....!!!
Avatar billede nat Nybegynder
18. november 2008 - 12:53 #7
aaberg_cc: Perfekt! Smider du ikke et svar?! :o)
Avatar billede aaberg Nybegynder
18. november 2008 - 12:56 #8
:-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester