Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: ".Net";
Текущий архив: 2010.10.03;
Скачать: [xml.tar.bz2];

Вниз

Потоки в C#   Найти похожие ветки 

 
Ilya39 ©   (2005-09-08 16:35) [0]

Изучаю С#. Разбирался с потоками. Не понятно следующее.
1). В Delphi было TThread  свойство Terminated и метод Terminate. Обычно я действовал по следующему принципу:

procedure TMyThread.Execute;
begin
 while not Terminated do
 begin
   //Do something
 end;
end;

//из основного потока:
mythread.Terminate;
mythread.WaitFor;


Как в C# организовать подобное? Вычитал что есть метод Abort  и класс ThreadAbortException. Например:


private void MyThreadStart()
{
 try
 {
   while (true)
   {
     for (int i = 0; i <= 500; i++)
     {
       listBox1.Items.Add(i);
     }
     Thread.Sleep(100);
   }
 }
 catch (ThreadAbortException e)
 {
   listBox1.Items.Add("Thread Abort!" + e.ToString());
 }
}

//из основного потока:
mythread.Abort();
mythread.Join();


Но дело в том,что в случае Terminated и Terminate тело моего цикла while гарантировано завершалось, а тут получается, что нет. В частности в ListBox будут блоки чисел не 1..500 а 1…Случайное число. Как же мне организовать в C# схему которая была в Delph? Наследоваться от Thread и объявлять нужное свойство а-ля Terminate? Или есть какой-то стандартный подход, о котором я не знаю?

2). Опять таки в Delphi был метод Syncronize(), а как быть в C#? Корректно ли писать listBox1.Items.Add(i) в дополнительном потоке (если речь идет только о добавлении элементов)?


 
Ilya39 ©   (2005-09-08 16:54) [1]


> Наследоваться от Thread

Оказывается TThread обявлен как sealed, от него и не унаследуешся...


 
Гость12   (2005-09-08 18:11) [2]

Посмотри ьакую схему

ManualResetEvent allDone

в потоке
allDone.Reset();
...
allDone.WaitOne(); // тормознуть поток

В другом потоке

allDone.Set();  // продолжаем выполнять

может помогет. (Просто не совсем понял задачу)


 
Гость12   (2005-09-08 18:16) [3]

Кстати: Если я правильно понял то можно сделать так:

Досчитал до 500 и затем

allDone.WaitOne  //поток останавливается до allDone.Set()

а в другом если ненадо запускать делаешб Abort()/


 
ilya39 ©   (2005-09-09 09:39) [4]


> Гость12   (08.09.05 18:16)

Мне не надо ждать в потоке, мне надо что-бы я его запустил и он делал неч-то непрерывно и переодически выплевывал результат в основной поток. А по команде из основного потока, "доделав" тело цикла while завершался. Но в принципе, зря я наверно дискуссию затеял. Можно обявить еще одну логическую переменную MyTerminate например и её использовать:

метод ThreadStart:
while (!MyTerminate)
{
 //Do some work...
}


 
ilya39 ©   (2005-09-09 09:43) [5]

Просто меня смутило что разработчики C# не реализовали в классе Thread метод и свойство подобные Terminate и Terminated как в Delphi - ситуация-то стандартная....


 
ilya39 ©   (2005-09-09 12:01) [6]

Отвечаю сам себе про Syncronize():
http://www.gotdotnet.ru/DotNet/FAQ/WindowsForms/Misc/299.aspx


 
bizonwar ©   (2005-09-12 12:35) [7]

2 ilya39
А чем вам не подходит :
Gets a value containing the states of the current thread.

public ThreadState ThreadState {get;}

Property Value
One of the ThreadState values indicating the state of the current thread. The initial value is Unstarted.


 
ilya39 ©   (2005-09-12 13:32) [8]


>  [7] bizonwar ©   (12.09.05 12:35)

Вы, наверно, не совсем поняли о чем я спрашивал. Не понимаю причем здесь свойство отображающее состояние потока....


 
bizonwar ©   (2005-09-12 14:20) [9]

2 ilya39 ©   (12.09.05 13:32) [8]
Да, прошу прощения, не разобрался.


 
bizonwar ©   (2005-09-12 14:32) [10]

Я тут попробовал, получилось вот что:

int Counter = 0;
 private void DoWork()
 {
  for(int i = Counter; i <= 5; i++)
  {
   MessageBox.Show(i.ToString());
   Counter = i;
   Thread.Sleep(5000);
  }

 }
 public void ThreadProcedure()
 {
  try
  {
   DoWork();
  }
  catch(ThreadAbortException e)
  {
   Thread.ResetAbort();
   ThreadProcedure();
  }
 }



Страницы: 1 вся ветка

Форум: ".Net";
Текущий архив: 2010.10.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.014 c
4-1240574544
Виталий
2009-04-24 16:02
2010.10.03
Как программно стать владельцем файла?


15-1278389451
Думкин
2010-07-06 08:10
2010.10.03
Где летающие скейты?


15-1278002591
KilkennyCat
2010-07-01 20:43
2010.10.03
В поисках оптоволокна наткнулся на "больных"


2-1278512975
Norfolk
2010-07-07 18:29
2010.10.03
Помогите с линейной интерполяцией пожалуйста.


15-1278275386
Юрий
2010-07-05 00:29
2010.10.03
С днем рождения ! 5 июля 2010 понедельник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский