Страница: 1 |
Страница: 1 |
Вопрос: Многопоточность в VB
Добавлено: 14.07.10 00:57
Автор вопроса: Serg
Привет Всем !
Есть у меня такая задача, знаю что можно только вот не пойму пока как это на деле сделать. Есть две функции первая через точный промежуток времени выдает сигнал в ЛПТ порт компьютера а вторая паралельная функция должна отлавливать флажек который вылетает в первой функции после определенного колличества сигналов и сичитывать значение с Ком порта..
Все написано.. только не разберусь с потоками.. может кто пробовал использовать их в своих приложениях ? обьясните как их правильно готовить :) Заранее благодарен !
Ответы
Всего ответов: 15
Номер ответа: 1
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #1
Добавлено: 14.07.10 02:20
В .NET использовал. Рассказ о том как правильно готовить можно растянуть на целую книгу.
Но у тебя VB6? Не вдаваясь в подробности, ничего хорошего не получится.
Если очень нужно, можно попробовать сделать на таймерах.
Номер ответа: 2
Автор ответа:
Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #2
Добавлено: 14.07.10 11:03
На VB6 можно благополучно использовать отдельные проги, приоритет повыше, синхронизировать тоже можно более или менее.
Но всё это колдовство от лукавого конечно...
Номер ответа: 3
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #3
Добавлено: 14.07.10 11:47
Можно использовать потоки. Но для хорошей, годной многопоточности лучше обернуть потоки в COM. Тогда VB6 не будет вылетать, и даже, по-моему, позволит проходить по шагам. Еще вариант юзать .NET-обертку в VB.
Номер ответа: 4
Автор ответа:
Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #4
Добавлено: 14.07.10 15:16
лучше обернуть потоки в COM
а слабо показать кодом, как именно ты это хочешь сделать
Библиотеки msvbvm60.dll разные бывают.
Номер ответа: 5
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #5
Добавлено: 14.07.10 15:24
http://www.codenet.ru/progr/vbasic/threads.php
Бо?
Номер ответа: 6
Автор ответа:
Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #6
Добавлено: 14.07.10 16:14
Незнаю нафиг, незнаю, такое я тоже видел.
НЕСТАБИЛЬНО!!!
Номер ответа: 7
Автор ответа:
Serg
Вопросов: 1
Ответов: 2
Профиль | | #7
Добавлено: 14.07.10 23:55
А как можно сделать чтобы стабильно было ? Чтобы главное первый поток как часы работал а второй просто по сигналу значение сохранял..
Номер ответа: 8
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #8
Добавлено: 15.07.10 02:06
Сделать на нормальном языке программирования (C++, .NET)
Я тебе привел один из вариантов как это сделать на VB6 - таймерами. Будет работать в буквальном смысле этого слова "как часы"
Номер ответа: 9
Автор ответа:
Serg
Вопросов: 1
Ответов: 2
Профиль | | #9
Добавлено: 15.07.10 02:30
На таймерах не получится ... они очень тормозные ..
у меня подпрограмма задержки выглядит следующим образом
Dim temp, val As Long
For temp = 0 To Wait
val = val + 1
Next
End Sub
Где Wait в основном =15000 варьируя задержкой частота сигналов доходит до 20кГц.
Проблема в том что при считывании с ком порта весь код замирает на время до получения инфы при этом теряется стабильность импульсов. Весь смысл второго потока в том чтобы он обрабатывал ком порт пока главный цикл(поток) подходит к следующей точке. и.т.д.
На счет написания на другом языке, думаю не прокатит, какая разница каким ножем колбасу резать, ведь результат будет один и тот-же. В моем случае скорости приложения хватает в полне, а работа с ком портом на другом языке сомневаюсь что увеличит его скорость.
Номер ответа: 10
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #10
Добавлено: 15.07.10 04:33
Не завидую людям, которые пишут для ОС реального времени.
Номер ответа: 11
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #11
Добавлено: 18.07.10 21:47
может лучше использоваь апи gettickcount? сохраняешь точку начала задержки, потом в цикле проверяешь не прошло ли указанное количество времени. Геттиккаунт правда лажает раз в ~42 дня аптайма) но думаю некритично
Номер ответа: 12
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #12
Добавлено: 18.07.10 23:48
У GetTickCount низкое разрешение.
У меня 15-16 мс. Это чуть больше 60 герц.
Номер ответа: 13
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #13
Добавлено: 19.07.10 00:03
Artyom, но ведь в этом больше смысла, чем задержка с помощью цикла. Она же варьируется в зависимости от машины
Номер ответа: 14
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #14
Добавлено: 19.07.10 08:27
Более того, варьируетяс даже на одной и той же машине
Челу надо почитать про методы работы с портами. Скорее всего, есть инструментарий, позволяющий не опрашивать порт постоянно, а использовать буферизированую модель - данные из порта попадают в буфер, откуда их можно считывать порциями по мере поступления
Номер ответа: 15
Автор ответа:
VbStarter
ICQ: 357911808
Вопросов: 118
Ответов: 1340
Web-сайт:
Профиль | | #15
Добавлено: 16.08.10 20:49
vbnet.ru примеры - многопоточность ищите там