Главная страница
    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.012 c
8-1205562729
unknowing
2008-03-15 09:32
2010.10.03
Проблемма с GDI+


2-1278922587
JohnKorsh
2010-07-12 12:16
2010.10.03
Печать форм.


3-1245770351
ancot
2009-06-23 19:19
2010.10.03
TADOTable + Post = Exception


2-1278501707
DC-AC
2010-07-07 15:21
2010.10.03
Изменить шрифт заголовка окна


15-1278577740
bss
2010-07-08 12:29
2010.10.03
Группировка в cxGrid





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский