Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.10.03;
Скачать: CL | DM;

Вниз

Потоки в 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 вся ветка

Текущий архив: 2010.10.03;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
2-1278747785
john-s
2010-07-10 11:43
2010.10.03
Не подключается к удаленной БД


2-1279056532
Новичок
2010-07-14 01:28
2010.10.03
Проблемы с StrToDate


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


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


15-1278309120
Ulugbek
2010-07-05 09:52
2010.10.03
Как удалить в самом Delphi Recent open files?