Страница: 1 | 2 | 3 |
|
Вопрос: Пауза потоков
|
Добавлено: 15.03.11 21:59
|
|
Номер ответа: 23 Автор ответа:
andrey
   
ICQ: 305986093 
Вопросов: 3 Ответов: 41
|
Профиль | | #23
|
Добавлено: 17.03.11 16:31
|
AgentFire
Я понял тебя и твое отрицательное отношение к чему либо напоминающем о vb6, да практики программирования на .Net мало, весь его потенциал для меня далеко не раскрыт, советом изучить синтаксис .Net обязательно воспользуюсь. Млять, но зачем хамить, мне, что по вашему в не хватает негатива? Его вокруг до хрена и больше, зачем жить по закону "не подъебешь, не проживешь"?
- # QueryPerformanceCounter(tm1)
- # Do While com.BytesToRead < Raiz_Buf
- #
- # Thread.Sleep(1)
- # QueryPerformanceCounter(tm2)
- # QueryPerformanceFrequency(fr)
- # If Format(((tm2 - tm1) / fr * 1000), "###0.000";) > 200 Then
- # GoTo e
- # End If
- # 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
|
Господи, чтож вы как дети, сколько же вам лет ))? Признаюсь рад, что написал честно )) Ничем и никак. Просто это глупо и по-детски. Безусловный оператор низкого уровня, на чем в принципе и работает операционка, и вошпе все )).
Слушай дружище, вроде всю ситуацию и проблему я описал и не раз, если можешь, то покажи или напиши, как в моем случае поможет пул потоков? Ну если реально в силу чего либо не можешь помочь, то я дальше буду искать самостоятельно пути решения проблемы.
Ответить
|
Номер ответа: 28 Автор ответа:
andrey
   
ICQ: 305986093 
Вопросов: 3 Ответов: 41
|
Профиль | | #28
|
Добавлено: 18.03.11 14:33
|
AgentFire ну я вроде все описал подробно, вплоть до того, что и где объявляю, я же могу всю прогу тебе скинуть.
Раньше использовал потоки только при работе с базой, если там много времени затрачивается на выполнение чего-то. А тут нужно было для эксперимента, как можно ближе к реальному времени события отлавливать. Потоки объявлял в модуле, а в форме присваивал процедуру и запускал.- Поток = New Thread(AddressOf Read_7080)
- Поток.Start()
Я так понял пул, это, что-то типа Thread, также назначаешь ему процедуру, которая будет выполнятся, только он сам выбирает свободный поток и сам назначает ему выполнение этой процедуры??? А какой свободный поток, который мы создадим или любой, который в системе весит, вот тут я еще не совсем разобрался?!
И еще мне же нужно чтоб посылка в порты и обработка ответов происходили постоянно, как можно чаще и быстрее!
Поэтому и решил посылку-ответ Com портов запихнуть в потоки.
Ответить
|
Номер ответа: 30 Автор ответа:
Artyom
      
Разработчик
Вопросов: 130 Ответов: 6602
|
Профиль | | #30
|
Добавлено: 19.03.11 11:14
|
Вообще товарищи так увлеклись поливанием друг друга говном что даже не удосужились выяснить какую задачу решают. Смотря на приведенные куски кода, могу предположить, что задача состоит в том, чтоб считать сообщение определенной длинной втечение ограниченого времени. Если это не удалось сделать за указаное время, считается что произошел таймаут.
Это делается гораздо порще, без циклов. В простейшем случае можно обойтись пример таким кодом
- public static byte[] ReadBytes(this SerialPort port, int length, TimeSpan timeout)
- {
- using (ManualResetEvent receivedEvent = new ManualResetEvent(false))
- {
- SerialDataReceivedEventHandler receiveEventHandler =
- (o, e) =>
- {
- if (port.BytesToRead >= length)
- receivedEvent.Set();
- };
-
- try
- {
- port.DataReceived += receiveEventHandler;
-
- if (receivedEvent.WaitOne(timeout))
- {
- byte[] buffer = new byte[length];
- port.Read(buffer, 0, buffer.Length);
-
- return buffer;
- }
- else
- {
- throw new TimeoutException();
- }
- }
- finally
- {
- port.DataReceived -= receiveEventHandler;
- }
- }
- }
Могу предположить что этим способом не удастся считать сообщение, которое длиннее чем размер буфера SerialStream (SerialPort по сути является простой оберткой над этим классом).
Этот метод не является потокбезопасным, поэтому, если порт используется одновременно несколькими потоками, нужно будет делать внешнюю синхронизацию или переписывать метод.
В более сложном случае в событии DataReceived нужно будет считывать из порта полученые данные и сохранять их во временном буфере. Однако без наличия окружения для тестирования работы портов не считаю нужным делать пример.
Также можно получить досутп к внутреннему потоку (св-во BaseStream и с него считывать данные в асинхронном режиме.
Также можно поверх потока кинуть BinaryReader и считывать данные. Комибируя это со свойством SerialPort.ReadTimeout (странно что ты не начал с него).
Ответить
|
Страница: 1 | 2 | 3 |
Поиск по форуму