Потоки C# (гугл не помог)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Natali Osina, 26 Jun 2011.

  1. Natali Osina

    Natali Osina New Member

    Joined:
    15 Jun 2011
    Messages:
    65
    Likes Received:
    3
    Reputations:
    0
    Всем привет)
    к продолжению темы
    http://forum.antichat.ru/threadnav281043-1-10.html
    после того как получилось залогинится и спарсить информацию с страницы, я подумала, что было бы неплохо динамически ее менять после того, как, например, прошло 5 минут после ее предыдущего получения.

    Из того что я уже выучила по шарпу, понятно что нужно использовать потоки.
    В принципе логику я написала, но главная форма у меня висит пока поток обрабатывает инфу и ДОЛЖЕН обновлять ее на форме.
    Без потоков просто по евенту нажатия кнопки все работает.

    теперь то что я накодила...

    Нажатие кнопки ЛОГИН

    PHP:
    private void LoginButton_Click(object senderEventArgs e)
            {
                    
    isRunning true//указатель на то, что нажата кнопка
                    
    while (isRunning==true)
                    {
                        
    DateTime currentTime DateTime.Now;
                        
    DateTime nextWatchTime currentTime.AddSeconds(30);
                        
    Thread watcher = new Thread(watcherMethod);
                        
    watcher.Start();
                        
    watcher.IsBackground true;
                        
    //while (!watcher.IsAlive) ;
                        
    Thread.Sleep(1);
                        
    watcher.Join();
                        
    moneyLabel.Text depos//обновить информацию на форме
                        
    while (DateTime.Now nextWatchTime) ;//через 30 секунд повторить
                    
    }
            }
    и теперь сам метод, который запускается в потоке

    PHP:
    [MethodImplAttribute(MethodImplOptions.Synchronized)]
            private 
    void watcherMethod()
            {
                if (
    InvokeRequired)
                {
                    
    BeginInvoke(new MethodInvoker(() =>
                    {
                        ....
    пару методови т.д.
                        
    depos parse.FindInfo(deposite); //конечный результат - строка баланса
                    
    }));
                }
            }
     
    #1 Natali Osina, 26 Jun 2011
    Last edited: 26 Jun 2011
  2. Natali Osina

    Natali Osina New Member

    Joined:
    15 Jun 2011
    Messages:
    65
    Likes Received:
    3
    Reputations:
    0
    Да, у меня есть еще кнопка стоп, для того, что бы остановить получение информации.
    вот ее код

    PHP:
    private void stopButton_Click(object senderEventArgs e)
            {
                
    moneyLabel.Text "Нажмите СТАРТ";
                
    isRunning false//указать на то, что работа остановлена и дальше не нужно запускать поток.
            
    }
     
  3. Natali Osina

    Natali Osina New Member

    Joined:
    15 Jun 2011
    Messages:
    65
    Likes Received:
    3
    Reputations:
    0
    привет )
    спасибо сейчас попробую.
    я тут пока сама надумала почему все может виснуть, и думаю это может быть из-за постоянной работы куска кода в нажатии кнопки логин, а именно здесь
    while (DateTime.Now < nextWatchTime) ;
    попробую засунуть этот кусок кода как то в метод, который в потоке работает.
    если не получится буду уже смотреть твою идею реализации.
    К стати я не помню где, но читала, когда разбиралась с потоками, что лучше для потока СЛИП не использовать, так как это черевато какими то там последствиями, но какими именно я уже забыла)))
    Сейчас потестю что получается у меня и потом твой метод.)
     
  4. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    нафиг тут вообще потоки юзать.
    таймер
     
  5. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Всего лишь:
    1. Ложим на форму таймер, настраиваем как надо, ставим интервал, Enabled = true
    2. На событие Tick пишем такой код:
    Code:
            private void timer_Tick(object sender, EventArgs e)
            {
                ThreadPool.QueueUserWorkItem( state => Foo(null));
            }
    где метод Foo:
    Code:
            private void Foo(object state)
            {
                // чего то там делаем в рабочем потоке
            }
    И все!
     
  6. Natali Osina

    Natali Osina New Member

    Joined:
    15 Jun 2011
    Messages:
    65
    Likes Received:
    3
    Reputations:
    0
    я использовала следующий код
    DateTime currentTime = DateTime.Now;
    DateTime nextWatchTime = currentTime.AddSeconds(30)

    для того, что бы не постоянно гонять метод в потоке, а через определенный интервал.
    ну пусть там AddMinutes(3);
    а с таймером я не уловила смысл.. можно подробнее пожалуйста?
     
  7. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    ThreadPool.QueueUserWorkItem( state => Foo(null));
    Добавляет задачу в пул потоков каждый промежуток времени, равный интервалу таймера. Переданный туда метод будет выполнен в другом потоке. Контролирует эти потоки сам пул, самостоятельно создавать и следить за состоянием потока в данной задаче избыточно.
    А если к контролам внутри Foo нужно обращаться, то через Invoke.
    Еще можно воспользоваться асинхронными делегатами. Но это уже другая история.
     
    1 person likes this.
  8. Natali Osina

    Natali Osina New Member

    Joined:
    15 Jun 2011
    Messages:
    65
    Likes Received:
    3
    Reputations:
    0
    Спасибо большое ребята, я еще сама прочитаю с Шилдта и Троэлсена что бы закрепить то что уже вроде поняла)
    и на досуге еще попробую все таки домучать тот способ, который у меня не работал.
    Думаю там точно проблема в
    while (DateTime.Now < nextWatchTime) ;
    но скорее всего я пошла по ложному пути, так как все намного проще оказалось)
     
  9. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    BackgroundWorker ищи, какие нафиг таймеры тут?! О_О
    http://www.c-sharpcorner.com/UploadFile/LivMic/BGWorker07032007000515AM/BGWorker.aspx
    http://msdn.microsoft.com/en-us/library/ywkkz4s1.aspx
     
  10. Feonor

    Feonor Elder - Старейшина

    Joined:
    23 Jul 2008
    Messages:
    128
    Likes Received:
    52
    Reputations:
    19
    BackgroundWorker (инфа на русском с подробным примером)
     
  11. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    W!z@rD как всегда всех вставил xD
     
  12. Natali Osina

    Natali Osina New Member

    Joined:
    15 Jun 2011
    Messages:
    65
    Likes Received:
    3
    Reputations:
    0
    Спасибо
    Да, действительно, прочитала о BackgroundWorker и думаю это лучшее решение для моей задачи.
     
  13. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    W!z@rD, Feonor
    какие нафиг бэкграундворкеры тут?! О_О
    Есть задача, нужно ее выполнять в отдельном потоке каждый интервал времени. Всего-то положить таймер на форму, и написать ровно 1 строку кода, чтобы положить задачу в тредпул, который для этого и предназначен:
    А приведите ка мне такое же компактное решение с BackgroundWorker? Сомневаюсь что приведете. Из плюсов вижу ProgressChanged и RunWorkerCompleted.
    W!z@rD перестань пихать в свой каждый второй пост этот BackgroundWorker. Все задачи кажутся гвоздями, когда в руках любимый молоток?
     
    #13 GhostOnline, 27 Jun 2011
    Last edited: 27 Jun 2011
  14. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    фраза крутая)
     
  15. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    все задачи кажутся гвоздями, когда в руках тапок.
    не?

    BW самый простой вид реализации, учитывая то что описывает ТС и те темы, что он создавал.
    Рассказывать об InvokeRequred и тому подобное покажется сложным.
    +Анонимные делегаты
    +Лямбда выражения.

    Нахрен надо?
    Я не могу уже без использования вышеперечисленного.

    В BW же не надо заморачиваться с доступом к контролам.
    Вызвал ReportProgress и все.
    Не нужно разбираться с Manual/Auto ResetEvent, а лишь повеситься на событие.

    Считаю что данный класс самый простой для типовых задач - сделать, дождаться, показать.

    имхо
     
    #15 W!z@rD, 28 Jun 2011
    Last edited: 28 Jun 2011