Всем привет) к продолжению темы http://forum.antichat.ru/threadnav281043-1-10.html после того как получилось залогинится и спарсить информацию с страницы, я подумала, что было бы неплохо динамически ее менять после того, как, например, прошло 5 минут после ее предыдущего получения. Из того что я уже выучила по шарпу, понятно что нужно использовать потоки. В принципе логику я написала, но главная форма у меня висит пока поток обрабатывает инфу и ДОЛЖЕН обновлять ее на форме. Без потоков просто по евенту нажатия кнопки все работает. теперь то что я накодила... Нажатие кнопки ЛОГИН PHP: private void LoginButton_Click(object sender, EventArgs 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); //конечный результат - строка баланса })); } }
Да, у меня есть еще кнопка стоп, для того, что бы остановить получение информации. вот ее код PHP: private void stopButton_Click(object sender, EventArgs e) { moneyLabel.Text = "Нажмите СТАРТ"; isRunning = false; //указать на то, что работа остановлена и дальше не нужно запускать поток. }
привет ) спасибо сейчас попробую. я тут пока сама надумала почему все может виснуть, и думаю это может быть из-за постоянной работы куска кода в нажатии кнопки логин, а именно здесь while (DateTime.Now < nextWatchTime) ; попробую засунуть этот кусок кода как то в метод, который в потоке работает. если не получится буду уже смотреть твою идею реализации. К стати я не помню где, но читала, когда разбиралась с потоками, что лучше для потока СЛИП не использовать, так как это черевато какими то там последствиями, но какими именно я уже забыла))) Сейчас потестю что получается у меня и потом твой метод.)
Всего лишь: 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) { // чего то там делаем в рабочем потоке } И все!
я использовала следующий код DateTime currentTime = DateTime.Now; DateTime nextWatchTime = currentTime.AddSeconds(30) для того, что бы не постоянно гонять метод в потоке, а через определенный интервал. ну пусть там AddMinutes(3); а с таймером я не уловила смысл.. можно подробнее пожалуйста?
ThreadPool.QueueUserWorkItem( state => Foo(null)); Добавляет задачу в пул потоков каждый промежуток времени, равный интервалу таймера. Переданный туда метод будет выполнен в другом потоке. Контролирует эти потоки сам пул, самостоятельно создавать и следить за состоянием потока в данной задаче избыточно. А если к контролам внутри Foo нужно обращаться, то через Invoke. Еще можно воспользоваться асинхронными делегатами. Но это уже другая история.
Спасибо большое ребята, я еще сама прочитаю с Шилдта и Троэлсена что бы закрепить то что уже вроде поняла) и на досуге еще попробую все таки домучать тот способ, который у меня не работал. Думаю там точно проблема в while (DateTime.Now < nextWatchTime) ; но скорее всего я пошла по ложному пути, так как все намного проще оказалось)
BackgroundWorker ищи, какие нафиг таймеры тут?! О_О http://www.c-sharpcorner.com/UploadFile/LivMic/BGWorker07032007000515AM/BGWorker.aspx http://msdn.microsoft.com/en-us/library/ywkkz4s1.aspx
W!z@rD, Feonor какие нафиг бэкграундворкеры тут?! О_О Есть задача, нужно ее выполнять в отдельном потоке каждый интервал времени. Всего-то положить таймер на форму, и написать ровно 1 строку кода, чтобы положить задачу в тредпул, который для этого и предназначен: А приведите ка мне такое же компактное решение с BackgroundWorker? Сомневаюсь что приведете. Из плюсов вижу ProgressChanged и RunWorkerCompleted. W!z@rD перестань пихать в свой каждый второй пост этот BackgroundWorker. Все задачи кажутся гвоздями, когда в руках любимый молоток?
все задачи кажутся гвоздями, когда в руках тапок. не? BW самый простой вид реализации, учитывая то что описывает ТС и те темы, что он создавал. Рассказывать об InvokeRequred и тому подобное покажется сложным. +Анонимные делегаты +Лямбда выражения. Нахрен надо? Я не могу уже без использования вышеперечисленного. В BW же не надо заморачиваться с доступом к контролам. Вызвал ReportProgress и все. Не нужно разбираться с Manual/Auto ResetEvent, а лишь повеситься на событие. Считаю что данный класс самый простой для типовых задач - сделать, дождаться, показать. имхо