Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

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

 

  Вопрос: Пауза потоков Добавлено: 15.03.11 21:59  

Автор вопроса:  andrey | ICQ: 305986093 

Ответить

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

Номер ответа: 16
Автор ответа:
 andrey



ICQ: 305986093 

Вопросов: 3
Ответов: 41
 Профиль | | #16 Добавлено: 17.03.11 14:37
andrey пишет:
CLng(TimeoutSw.ElapsedMilliseconds.ToString) >= 200

Мать моя женщина, это что за нахуй?!!
если твоему величеству угодно убери CLng, но без ToString будет ошибка!

Включая мозг, внезапно обнаруживаем, что можно написать

   1. If TimeoutSw.ElapsedMiliseconds > 200 Then Continue Do

и все вдруг "робит".

Попробуй включить свой, данный Do While com.BytesToRead < Raiz_Buf And TimeoutSw.ElapsedMiliseconds <= 200 зациклится, и,что это будет за хуйня?
По поводу Sleep виноват, не заметил!

Ответить

Номер ответа: 17
Автор ответа:
 andrey



ICQ: 305986093 

Вопросов: 3
Ответов: 41
 Профиль | | #17 Добавлено: 17.03.11 14:39
если твоему величеству угодно убери CLng, но без ToString будет ошибка!
сори, ошибся видно не на то посмотрел ))

Ответить

Номер ответа: 18
Автор ответа:
 andrey



ICQ: 305986093 

Вопросов: 3
Ответов: 41
 Профиль | | #18 Добавлено: 17.03.11 14:41
Замечательно, пришел с вопросом, на который не кто не хочет или не может ответить, зато до метода кодинга и используемые операторы даебок со всех сторон, нахрен это надо, скажите?

Ответить

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



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #19 Добавлено: 17.03.11 14:42
andrey пишет:
Попробуй включить свой, данный Do While com.BytesToRead < Raiz_Buf And TimeoutSw.ElapsedMiliseconds <= 200 зациклится, и,что это будет за хуйня?
Вот ты опять зафейлил.
  1. Do
  2.     
  3.     Dim TimeoutSw = Stopwatch.StartNew
  4.     While (true)
  5.         If TimeoutSw.ElapsedMiliseconds > 200 Then Continue Do
  6.     End While
  7.     
  8. Loop
Вот что я имел ввиду. И не зная основ, ты этого понять не мог. Так что вынужден цитировать коллегу, "Почитай для начала документацию по языку и платформе, что ты используешь.."

Ответить

Номер ответа: 20
Автор ответа:
 andrey



ICQ: 305986093 

Вопросов: 3
Ответов: 41
 Профиль | | #20 Добавлено: 17.03.11 14:43
Спасибо всем за помощь, дальнейшие открытие вопроса считаю не нужным.
p.s. Обязательно буду читать матчасть, и не один раз, чего и все советую.

Ответить

Номер ответа: 21
Автор ответа:
 andrey



ICQ: 305986093 

Вопросов: 3
Ответов: 41
 Профиль | | #21 Добавлено: 17.03.11 14:47
AgentFire ты просто не понял суть этого цикла
  1. QueryPerformanceCounter(tm1)
  2.                 Do While com.BytesToRead < Raiz_Buf
  3.                     'value = instance.BytesToRead
  4.                     Thread.Sleep(1)
  5.                     QueryPerformanceCounter(tm2)
  6.                     QueryPerformanceFrequency(fr)
  7.                     If Format(((tm2 - tm1) / fr * 1000), "###0.000";) > 200 Then
  8.                         GoTo e
  9.                     End If
  10.                 Loop

Ответить

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



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #22 Добавлено: 17.03.11 14:58
andrey пишет:
AgentFire ты просто не понял суть этого цикла

Эти слова означают только то, что ты сам не понял суть моих слов. И так и не открыл синтаксис vb.net. И продолжишь писать говнокод аля GoTo

Ответить

Номер ответа: 23
Автор ответа:
 andrey



ICQ: 305986093 

Вопросов: 3
Ответов: 41
 Профиль | | #23 Добавлено: 17.03.11 16:31
AgentFire
Я понял тебя и твое отрицательное отношение к чему либо напоминающем о vb6, да практики программирования на .Net мало, весь его потенциал для меня далеко не раскрыт, советом изучить синтаксис .Net обязательно воспользуюсь. Млять, но зачем хамить, мне, что по вашему в не хватает негатива? Его вокруг до хрена и больше, зачем жить по закону "не подъебешь, не проживешь"?
  1. # QueryPerformanceCounter(tm1)
  2. #                 Do While com.BytesToRead < Raiz_Buf 'пока буыер не наполнится до нужного нам кол-ва байт
  3. #                     'value = instance.BytesToRead
  4. #                     Thread.Sleep(1)
  5. #                     QueryPerformanceCounter(tm2)
  6. #                     QueryPerformanceFrequency(fr)
  7. #                     If Format(((tm2 - tm1) / fr * 1000), "###0.000";) > 200 Then ' если время ожидания превысило 200 мс уходим на метку, минуя обработку ответа
  8. #                         GoTo e
  9. #                     End If
  10. #                 Loop


Хорошо, объясни, чем или как так плохо влияет на работу программы GoTo? Какую отрицательную роль может сыграть со стороны операционки или железа?
И ты, что-то писал про пул потоков, что именно ты хотел написать?
p.s. Надеюсь, то, что я на "Ты" не как не играет на вашем самолюбие, а то некоторых, как видно задевает?

Ответить

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



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #24 Добавлено: 17.03.11 19:59
andrey пишет:
Надеюсь, то, что я на "Ты" не как не играет на вашем самолюбие, а то некоторых, как видно задевает?

Ну дык да, здесь все такие неженки, что прям ух :-[

andrey пишет:
И ты, что-то писал про пул потоков, что именно ты хотел написать?
Хотел написать, что все асинхронные операции и реализации таймаутов лучше всего кодить именно через тредпул.

andrey пишет:
Хорошо, объясни, чем или как так плохо влияет на работу программы GoTo?
Ничем и никак. Просто это глупо и по-детски.

andrey пишет:
мне, что по вашему в не хватает негатива?
Дааа! давай добавим))

Ответить

Номер ответа: 25
Автор ответа:
 andrey



ICQ: 305986093 

Вопросов: 3
Ответов: 41
 Профиль | | #25 Добавлено: 17.03.11 22:15
Господи, чтож вы как дети, сколько же вам лет ))? Признаюсь рад, что написал честно ))
Ничем и никак. Просто это глупо и по-детски.
Безусловный оператор низкого уровня, на чем в принципе и работает операционка, и вошпе все )).
Слушай дружище, вроде всю ситуацию и проблему я описал и не раз, если можешь, то покажи или напиши, как в моем случае поможет пул потоков? Ну если реально в силу чего либо не можешь помочь, то я дальше буду искать самостоятельно пути решения проблемы.

Ответить

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



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #26 Добавлено: 18.03.11 11:21
Я уже писал, что чтобы полноценно сипользовать пул, нужно понимать все задание сразу. А ты дал кусок процедуры, в котором использовал переменные которые в этой процедуре даже не объявлены.

Ответить

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



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #27 Добавлено: 18.03.11 11:21
Я уже писал, что чтобы полноценно сипользовать пул, нужно понимать все задание сразу. А ты дал кусок процедуры, в котором использовал переменные которые в этой процедуре даже не объявлены.

Ответить

Номер ответа: 28
Автор ответа:
 andrey



ICQ: 305986093 

Вопросов: 3
Ответов: 41
 Профиль | | #28 Добавлено: 18.03.11 14:33
AgentFire ну я вроде все описал подробно, вплоть до того, что и где объявляю, я же могу всю прогу тебе скинуть.
Раньше использовал потоки только при работе с базой, если там много времени затрачивается на выполнение чего-то. А тут нужно было для эксперимента, как можно ближе к реальному времени события отлавливать. Потоки объявлял в модуле, а в форме присваивал процедуру и запускал.
  1. Поток = New Thread(AddressOf Read_7080)
  2.        Поток.Start()

Я так понял пул, это, что-то типа Thread, также назначаешь ему процедуру, которая будет выполнятся, только он сам выбирает свободный поток и сам назначает ему выполнение этой процедуры??? А какой свободный поток, который мы создадим или любой, который в системе весит, вот тут я еще не совсем разобрался?!
И еще мне же нужно чтоб посылка в порты и обработка ответов происходили постоянно, как можно чаще и быстрее!
Поэтому и решил посылку-ответ Com портов запихнуть в потоки.

Ответить

Номер ответа: 29
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #29 Добавлено: 19.03.11 11:02
1). От чего могут не запустится все потоки?

Могу предположить что где-то в начале стека стоит обрабочтик ошибок try с пустым блоком catch, в итоге при возникновении исключения поток просто завершает свою работу.
Советую начать с этого, так как остальные возможные причины, которые пока приходят в голову, оказывали бы видимое влияние на приложение (например полное падение домена).

2). Как правильно выдержать паузу потока от 5 до 50 мс.?

В общем случае никак. Можно использовать Thread.Sleep, чтоб сделать паузу как минимум 50 мс. Реальное же время паузы будет непостоянным.

Ответить

Номер ответа: 30
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #30 Добавлено: 19.03.11 11:14
Вообще товарищи так увлеклись поливанием друг друга говном что даже не удосужились выяснить какую задачу решают. Смотря на приведенные куски кода, могу предположить, что задача состоит в том, чтоб считать сообщение определенной длинной втечение ограниченого времени. Если это не удалось сделать за указаное время, считается что произошел таймаут.

Это делается гораздо порще, без циклов. В простейшем случае можно обойтись пример таким кодом

  1. public static byte[] ReadBytes(this SerialPort port, int length, TimeSpan timeout)
  2. {
  3.     using (ManualResetEvent receivedEvent = new ManualResetEvent(false))
  4.     {
  5.         SerialDataReceivedEventHandler receiveEventHandler =
  6.             (o, e) =>
  7.                 {
  8.                     if (port.BytesToRead >= length)
  9.                         receivedEvent.Set();
  10.                 };
  11.  
  12.         try
  13.         {
  14.             port.DataReceived += receiveEventHandler;
  15.  
  16.             if (receivedEvent.WaitOne(timeout))
  17.             {
  18.                 byte[] buffer = new byte[length];
  19.                 port.Read(buffer, 0, buffer.Length);
  20.  
  21.                 return buffer;
  22.             }
  23.             else
  24.             {
  25.                 throw new TimeoutException();
  26.             }
  27.         }
  28.         finally
  29.         {
  30.             port.DataReceived -= receiveEventHandler;
  31.         }
  32.     }
  33. }


Могу предположить что этим способом не удастся считать сообщение, которое длиннее чем размер буфера SerialStream (SerialPort по сути является простой оберткой над этим классом).
Этот метод не является потокбезопасным, поэтому, если порт используется одновременно несколькими потоками, нужно будет делать внешнюю синхронизацию или переписывать метод.

В более сложном случае в событии DataReceived нужно будет считывать из порта полученые данные и сохранять их во временном буфере. Однако без наличия окружения для тестирования работы портов не считаю нужным делать пример.

Также можно получить досутп к внутреннему потоку (св-во BaseStream и с него считывать данные в асинхронном режиме.
Также можно поверх потока кинуть BinaryReader и считывать данные. Комибируя это со свойством SerialPort.ReadTimeout (странно что ты не начал с него).

Ответить

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

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



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