Страница: 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 примеры - многопоточность ищите там