Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 | 3 | 4 | 5 | 6 |

 

  Вопрос: русские буквы Добавлено: 21.09.10 15:53  

Автор вопроса:  Ishayahu | Web-сайт: ishayahu.blogspot.com | ICQ: 329944992 

Ответить

  Ответы Всего ответов: 90  

Номер ответа: 31
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #31 Добавлено: 23.09.10 13:26
ее все таки юзают джедаи?

еще как юзают.. точнее только ее и юзают. Если надо что то передать, то создаешь наследника от EventArgs и добавляй что угодно.
синхронизировать - научите! )

да не вопрос, запросто
и давай еще по 27му посту..

А что там по 27 посту??
Единственное что могу добавить что использование Base64 реально не оправдано, т.к. он на 30% увеличивает объем передаваемой информации.. Xml тоже не вариант - слишком много мусора..

Ответить

Номер ответа: 32
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #32 Добавлено: 23.09.10 13:30
EROS пишет:
использование Base64 реально не оправдано
а что оправдано тогда?
EROS пишет:
да не вопрос, запросто
Давай :) мне всего-то нужно инвокнуться обратно, ну желательно с параметрами.

Ответить

Номер ответа: 33
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #33 Добавлено: 23.09.10 14:29
а что оправдано тогда?

Оправдан чистый байтовый массив.. Разрабтай свой протокол и парси на другой стороне в соответствии с протоколом

Давай мне всего-то нужно инвокнуться обратно, ну желательно с параметрами.

  1.  
  2. using System;
  3. using System.Windows.Forms;
  4. using System.Threading;
  5.  
  6. namespace VbNet.Ru
  7. {
  8.     public partial class Form1 : Form
  9.     {
  10.  
  11.         public Form1()
  12.         {
  13.             InitializeComponent();
  14.         }
  15.  
  16.         protected override void OnShown(EventArgs e)
  17.         {
  18.             base.OnShown(e);
  19.  
  20.             Thread th = new Thread(DoWork) { IsBackground = true };
  21.             th.Start();
  22.         }
  23.  
  24.         private void DoWork()
  25.         {
  26.             for (int i = 0; i < 10; i++)
  27.             {
  28.                 string value = string.Format("Value: {0}", i);
  29.                 Action<string> m_setTextAction = (s) => Text = s;
  30.  
  31.  
  32.                 //Invoke(m_setTextAction, value);
  33.                 //Invoke((MethodInvoker)(() => { this.Text = value; }));
  34.                 //SetText(value);
  35.  
  36.                 Thread.Sleep(250);
  37.             }
  38.         }
  39.  
  40.         /// <summary>
  41.         /// Классический вариант
  42.         /// </summary>
  43.         /// <param name="s"></param>
  44.         public delegate void SetTextDelegate(string s);
  45.         private void SetText(string s)
  46.         {
  47.             if (InvokeRequired)
  48.             {
  49.                 SetTextDelegate d = SetText;
  50.                 Invoke(d, s);
  51.             }
  52.             else
  53.             {
  54.                 Text = s;
  55.             }
  56.         }
  57.     }
  58. }
  59.  



Это простые самые распространенные варианты, когда поток на форме и есть метод Invoke. Освоишь это, покажу другие методы синхронизации когда поток в отдельном классе и не охота париться с инвоками на форме. Но перед эти тебе надо почитать все,что касается делегатов, анонимных делегатов и лямбда выражений.

Ответить

Номер ответа: 34
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #34 Добавлено: 23.09.10 14:35
мне охота париться с инвоками на форме. жги их.

Ответить

Номер ответа: 35
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #35 Добавлено: 23.09.10 14:38
мне не*

Ответить

Номер ответа: 36
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #36 Добавлено: 23.09.10 15:02
  1.  
  2. using System;
  3. using System.Windows.Forms;
  4. using System.Threading;
  5. using System.ComponentModel;
  6.  
  7. namespace VbNet.Ru
  8. {
  9.  
  10.  
  11.  
  12.     public partial class Form1 : Form
  13.     {
  14.         public Form1()
  15.         {
  16.             InitializeComponent();
  17.         }
  18.         protected override void OnShown(EventArgs e)
  19.         {
  20.             base.OnShown(e);
  21.             AsyncWorker worker = new AsyncWorker();
  22.             worker.Progress += worker_Progress;
  23.             worker.Run();
  24.         }
  25.         private void worker_Progress(object sender, ProgressEventArgs e)
  26.         {
  27.             Text = "Value: " + e.Value;
  28.         }
  29.     }
  30.  
  31.     public class AsyncWorker
  32.     {
  33.         AsyncOperation async = AsyncOperationManager.CreateOperation(null);
  34.         public event ProgressEventHandler Progress;
  35.         public void Run()
  36.         {
  37.             Thread th = new Thread(DoWork) { IsBackground = true };
  38.             th.Start();
  39.         }
  40.         private void DoWork()
  41.         {
  42.             for (int i = 0; i <= 100; i++)
  43.             {
  44.                 OnProgress(i);
  45.                 Thread.Sleep(50);
  46.             }
  47.         }
  48.         protected virtual void OnProgress(int value)
  49.         {
  50.             if (Progress != null)
  51.             {
  52.                 SendOrPostCallback callback = (o) => { Progress(this, new ProgressEventArgs(value)); };
  53.                 async.Post(callback, null);
  54.             }
  55.         }
  56.     }
  57.  
  58.     public delegate void ProgressEventHandler(object sender, ProgressEventArgs e);
  59.     public class ProgressEventArgs : EventArgs
  60.     {
  61.         public ProgressEventArgs(int value) { Value = value; }
  62.         public int Value { get; private set; }
  63.     }
  64. }

Ответить

Номер ответа: 37
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #37 Добавлено: 23.09.10 15:09
Вариант с использованием SynchronizationContext
  1.  
  2. using System;
  3. using System.Windows.Forms;
  4. using System.Threading;
  5.  
  6. namespace VbNet.Ru
  7. {
  8.     public partial class Form1 : Form
  9.     {
  10.         public Form1()
  11.         {
  12.             InitializeComponent();
  13.         }
  14.         protected override void OnShown(EventArgs e)
  15.         {
  16.             base.OnShown(e);
  17.             AsyncWorker worker = new AsyncWorker();
  18.             worker.Progress += worker_Progress;
  19.             worker.Run();
  20.         }
  21.         private void worker_Progress(object sender, ProgressEventArgs e)
  22.         {
  23.             Text = "Value: " + e.Value;
  24.         }
  25.     }
  26.  
  27.     public class AsyncWorker
  28.     {
  29.         SynchronizationContext context = SynchronizationContext.Current;
  30.         public event ProgressEventHandler Progress;
  31.         public void Run()
  32.         {
  33.             Thread th = new Thread(DoWork) { IsBackground = true };
  34.             th.Start();
  35.         }
  36.         private void DoWork()
  37.         {
  38.             for (int i = 0; i <= 100; i++)
  39.             {
  40.                 OnProgress(i);
  41.                 Thread.Sleep(50);
  42.             }
  43.         }
  44.         protected virtual void OnProgress(int value)
  45.         {
  46.             if (Progress != null)
  47.             {
  48.                 SendOrPostCallback callback = (o) => { Progress(this, new ProgressEventArgs(value)); };
  49.                 context.Post(callback, null);
  50.                 //context.Send(callback, null); в чем разница объяснять нужно?
  51.             }
  52.         }
  53.     }
  54.  
  55.     public delegate void ProgressEventHandler(object sender, ProgressEventArgs e);
  56.     public class ProgressEventArgs : EventArgs
  57.     {
  58.         public ProgressEventArgs(int value) { Value = value; }
  59.         public int Value { get; private set; }
  60.     }
  61. }



Думаю, этого будет достаточно чтоб понять как юзать.. Дальше уж сам кури мануалы..

Ответить

Номер ответа: 38
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #38 Добавлено: 23.09.10 15:35
да, все предельно ясно, благодарю.

а теперь вопрос: а создали ли бы программисты собственноручно этот BW, не будь его УЖЕ в оболочке дотнета? я думаю да. имхо, это желание выпендриться. если нету класса, который позволяет облегчить работу - его надо написать и юзать. если есть - нужно гордо подняв голову, трахать себе моск более низкоуровневым способом. я прав? :)

Ответить

Номер ответа: 39
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #39 Добавлено: 23.09.10 15:54
Не прав.. стандартный BW - наследник от Component, а тот который я написал для себя - обычный класс, он разумеется легче и гибче.. и я всегда могу его допилить при необходимости под конкретную задачу..

Ответить

Номер ответа: 40
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #40 Добавлено: 23.09.10 15:58
>> в чем разница объяснять нужно?
нужно. студия не объяснила :)

Ответить

Номер ответа: 41
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #41 Добавлено: 23.09.10 15:59
По сути, BW - это надстройка на Thread для лохов, кто не в состоянии осилить работу с потоками и синхронизацию. Как только понимаешь как вся эта кухня работает, необходимость в BW полностью отпадает.. более того, ты получаешь чистый и устойчивый код, а так же полный контроль над тем что у тебя творится в потоке.

Ответить

Номер ответа: 42
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #42 Добавлено: 23.09.10 16:02
Send - это синхронный вызов.. т.е. управление не вернется до тех пор,пока не отработает код прописанный в обработчике события, а Post - ассинхронный вызов того же делегата (события).. т.е. в этом случае поток не будет ждать пока отработает твой обработчик события Progress, он дернул твоего делегата и тут же получил управление обратно

Ответить

Номер ответа: 43
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #43 Добавлено: 23.09.10 16:08
Чтобы нагляднее было измени 2 процедуры следующим образом:
  1.  
  2.         private void worker_Progress(object sender, ProgressEventArgs e)
  3.         {
  4.             Text = "Value: " + e.Value;
  5.             Thread.Sleep(1000);
  6.         }
  7.  
  8.         private void DoWork()
  9.         {
  10.             for (int i = 0; i <= 100; i++)
  11.             {
  12.                 OnProgress(i);
  13.                 Thread.Sleep(50);
  14.                 Console.WriteLine("iteration...");
  15.             }
  16.         }
  17.  



И посмотри на вывод в Output при вызове Post а потом Send

Ответить

Номер ответа: 44
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #44 Добавлено: 23.09.10 16:20
да я понял )

Ответить

Номер ответа: 45
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #45 Добавлено: 23.09.10 16:21
EROS пишет:
более того, ты получаешь чистый и устойчивый код, а так же полный контроль
о да, магистр йода, ваши слова влились в мой моцк.

Ответить

Страница: 1 | 2 | 3 | 4 | 5 | 6 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам