Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Изменение контрола из потока


Автор: Verus 25.10.2009, 19:57
Как сделать подскажите плиз или покажите где прочитать smile

Автор: Экскалупатор 25.10.2009, 21:06
почитать и сделать тут: http://msdn.microsoft.com/ru-ru/library/ms171728.aspx.

Автор: Verus 26.10.2009, 13:47
Там написано все в пределах одного класса, т.е. есть доступ для приватных полей, а у меня поток это отделный класс, как достучаться до контролов на форме из него?

Автор: Экскалупатор 26.10.2009, 14:02
Verus, все поддается одним и тем же правилам. доступ получается точно так же как и в одном потоке но в нескольких классах. т.е. класс из которого нужно изменять форму, должен знать о существовании формы, и иметь доступ к тому что нужно изменять.

Автор: Verus 26.10.2009, 14:18
А как лучше всего ему(классу) сообщить о форме? Наследоваться от нее или передать this в класс или есть еще способы?

Автор: Экскалупатор 26.10.2009, 14:26
читаем в форуме для новичков тему http://forum.vingrad.ru/forum/topic-52713.html.


p.s. очевидно что форма это такой же класс как и всякий другой, поэтому обратиться из одного класса к контролу класса формы это тоже самое что обратиться из одной формы к контролу другой.

p.p.s. а что значит наследовать форму? это из каких соображений такое можно делать(я про теорию)? производный класс будет являться формой? будет ее как то расширять? наверняка нет, а значит наследовать ее смысла нету. 

Автор: Verus 26.10.2009, 15:54
Спасибо большое. Решил просто передавать this формы в класс smile

Автор: IGV 29.10.2009, 15:40
Цитата(Verus @  26.10.2009,  15:54 Найти цитируемый пост)
Спасибо большое. Решил просто передавать this формы в класс  

не лучшее решение
Лучше пропишите в методе, который вызываете из потока.
А в UpdateData() - код который нужно выполнить
Код

               if (InvokeRequired)
                {
                    Invoke(new MethodInvoker(delegate { UpdateData(); }));
                }
                else
                {
                    UpdateData();
                }


Автор: tht 4.10.2010, 21:09
Не знаю... все перечитал что было по ссылкам... так нифига и не работает. а надо тоже самое что и автору вопроса.
даже эти инвоки делал, только не понял нафига они нужны если они не позволяют все равно передать данные из потока одного класса в контрол формы другого класса??? что this'ы что не this'ы толку нет.

это класс потоков:
Код

namespace webResponse {
    class ClassMyThread {
        private StreamReader SR;
        //char[] charBuff = new char[100];
        //byte[] byteBuff = new byte[100];
        //string stringBuff;
        Thread ThreadResponse;
        Thread ThreadMonitorRun;
        myForm myFormLink = new myForm();

        public ClassMyThread(StreamReader streamReader) {
            SR = streamReader;
        }

        public void RunThreadResponseProc(StreamReader sr) {
            ThreadResponse = new Thread(new ThreadStart(ThreadPesponse));
            ThreadResponse.Name = "ThreadResponse";
            ThreadResponse.Start();
        }

        public void RunThreadResponseProcMonitor() {
            ThreadMonitorRun = new Thread(new ThreadStart(ThreadMonitor));
            ThreadMonitorRun.Name = "ThreadMonitor";
            ThreadMonitorRun.Start();
        }

        public void ThreadPesponse() {
            MessageBox.Show("Thread proc Pesponse runned");
            while(SR.Peek() > -1) {
                //SR.ReadBlock(charBuff,0,100);
                //myFormLink.TextHTML.Text += SR.ReadLine();
                if(this.myFormLink.TextHTML.InvokeRequired) {
                    //this.myFormLink.Te
                    this.myFormLink.TextHTML.Invoke(new MethodInvoker(delegate { SR.ReadLine(); }));
                } else {
                    this.myFormLink.TextHTML.Text += SR.ReadLine();
                }
            }
        }

        public void ThreadMonitor() {
            MessageBox.Show("Thread Monitor started");
            while(ThreadResponse.IsAlive) {
                Thread.Sleep(50);
            }
            if(ThreadResponse.IsAlive == false) {
                MessageBox.Show("Thread Response ended");
                SR.Close();
            }
        }
    }
}


а вот класс формы в котором вызываются или создаются потоки:
Код

public partial class myForm:Form {
        public myForm() { InitializeComponent(); }
        HttpWebRequest hwr;
        HttpWebResponse hwrsp;
        WebHeaderCollection whc;

        private void buttonConnect_Click(object sender, EventArgs e) {
            listBoxHeaders.Items.Clear();
            listBoxCookies.Items.Clear();
            TextHTML.Clear();
            hwr = (HttpWebRequest)WebRequest.Create(textBoxURL.Text);
            hwr.Method = "GET";
            hwr.CookieContainer = new CookieContainer();
            hwrsp = (HttpWebResponse)hwr.GetResponse();
            whc = hwrsp.Headers;
            
            for(int i = 0; i < hwr.Headers.Count; i++){
                listBoxMyHeaders.Items.Add(hwr.Headers.GetKey(i) + " = " + hwr.Headers.Get(i));
            }

            for(int i = 0; i < whc.Count; i++) {
                listBoxHeaders.Items.Add(whc.GetKey(i) + " = " + whc.Get(i));
            }

            hwrsp.Cookies = hwr.CookieContainer.GetCookies(hwr.RequestUri);
            foreach(Cookie cky in hwrsp.Cookies) {
                listBoxCookies.Items.Add(cky.Name + " = " + cky.Value);
            }

            Stream strm = hwrsp.GetResponseStream();
            StreamReader sr = new StreamReader(strm, Encoding.UTF8);

            ClassMyThread ThreadWithParam = new ClassMyThread(sr);
            ThreadWithParam.RunThreadResponseProc(sr);
            ThreadWithParam.RunThreadResponseProcMonitor();
        }



Автор: Экскалупатор 4.10.2010, 22:11
а что надо менять?

Автор: tht 4.10.2010, 22:12
не работает this.myFormLink.TextHTML.Text += SR.ReadLine();
типа пытаюсь так обратиться из потока одного класса, для передачи текста(строки), к контролу формы другого класса, но данные не передаются.

Автор: Экскалупатор 4.10.2010, 22:23
ты создаешь новый экземпляр класса формы.
myForm myFormLink = new myForm();
 но не показываешь его. какие изменения ты хочешь увидеть?
получается что у тебя форма из которой запускается поток и myFormLink никак не связаны

Добавлено через 1 минуту и 1 секунду
Цитата(tht @  4.10.2010,  20:09 Найти цитируемый пост)
ThreadPesponse

наверное именоль ввиду Response  )))

Автор: tht 4.10.2010, 22:32
ну а как связать ?

Автор: Экскалупатор 4.10.2010, 22:38
я думаю тебе надо почитать и понять что такое this. потом надо понять что в каждом классе(!) свой this. а передать надо как раз этот самый this из формы в класс потоков. в классе потоков надо написать что то вроде
Код

myForm myFormLink;
        public ClassMyThread(StreamReader streamReader, myForm form) 
        {
            SR = streamReader;
            myFormLink = form;
        }


это если передавать ссылку на форму в конструктор класса. а использовать потом через myFormLink.(и чего то там).
при этом надо не забыть что если ты хочешь обращаться напрямую к контролу то контрол должен быть public.

Автор: tht 4.10.2010, 22:50
спасибо за отзывчивость... буду дальше пытаться. только уже не сегодня, целый день мучаюсь над этим  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)