Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

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

 

  Вопрос: Многопоточная программа. Добавлено: 11.08.04 08:09  

Автор вопроса:  Kolek | ICQ: 6223500 
Программа обрабатывает уйму записей. Нужно, чтобы она не стопорилась до конца обработки, а работала и работала. А то просто в стопор уходит и с приездом, жди когда закончит!

Ответить

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

Номер ответа: 1
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #1
Добавлено: 11.08.04 08:44
Ну дык ответ написан у тебя в названии темы. Только писать на VB многопоточное (чертова терминология, поток - это stream, а thread - это нить!) приложение не следует.
Если же она у тебя обрабатывает их в цикле, имеет смысл вставить DoEvents

Ответить

Номер ответа: 2
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #2 Добавлено: 11.08.04 09:04
Вставь в ключевых циклах DoEvents, только не на каждом шаге, а примерно через 100, иначе процесс существенно затянется.

Ответить

Номер ответа: 3
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #3
Добавлено: 11.08.04 10:04
Типа так
For i=0 To 1000000
DoSmth()
If i Mod 100=0 Then DoEvents
Next

Ответить

Номер ответа: 4
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #4
Добавлено: 11.08.04 12:12
C Потоками у VB вовсе туго, правда с Fiber чуть получше, но тоже хорошего маловато будет...
При создании нового потока, ему как и полагается отводится своя куча и т.д., но как только система решает что надо бы запустить поток, программа вылетает, а сейчас я скажу в чем дело...
При использовании функций из msvbvm60.dll (даже если видимого их использования и нет) включается обработчик ошибок, но он инициализироваться должен где-то "вверху", и записывать в регистры edi, esi и ebx адреса функций для обработки этих самых ошибок... Но! Поток-то начинает работать с той функции что ему дали, обработчик ошибок не настроен, и после вызова какой-нибудь функции будет какой-нибудь сall edi, разумеется именно в этот момент и произходит ошибка :(

Вот так вот господа, мелкософт хотела сделать как лучше, чтобы программер на VB не думал о лишних ошибках, а получилось как всегда, что программер на VB не может использовать многопоточность :(

Вы спросите, а почему же, есть же примеры где эта фишка работает... Могу-лишь развести руками и сказать что это счастливое совпадение...

Ответить

Номер ответа: 5
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #5 Добавлено: 11.08.04 13:16
Хотелось лишь отметить что в 99% случаев ошибка возникает именно при завершении потока, что не совсем вяжется с твоими данными.
Кроме того, потоки по-разному ведут себя в скомпилированной программе и в среде разработки. Да и в инете достаточно много инфы о т.н. Apartment Threading model, где потоки работают относительно стабильно.
В целом согласен, на VB5 и, особенно, VB6 использование многопоточности напоминает русскую рулетку, однако в VB.NET история уже совсем другая.
И еще пара ньюансов: вполне неплохую стабильность показывают многопоточные ActiveX.EXE. Но что мне непонятно - в VB6 при создании ActiveX.Dll также можно указать Threading model, однако разницы между Apartment threaded и Single threaded я не увидел. Может мне кто это объяснит?

Ответить

Номер ответа: 6
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #6 Добавлено: 11.08.04 15:00
Ещё немного о потоках: читал, что нестабильность этого дела можно значительно снизить, а то и вовсе исключить, если в отдельном потоке не использовать глобальные переменные. Насколько верно - не знаю, не проверял.

Ответить

Номер ответа: 7
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #7 Добавлено: 11.08.04 15:27
Насколько я знаю, в потоках вообще нельзя использовать глобальные переменные. Для потока они становятся локальными. Зато глюк 100% обеспечен.

Ответить

Номер ответа: 8
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #8 Добавлено: 11.08.04 15:29
По слухам и логике можно заключить что стабильным может считаться тот поток, в котором используются исключительно API функции. Хотя и при этом никто не гарантирует его стабильной работы :)

Ответить

Номер ответа: 9
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #9
Добавлено: 11.08.04 15:46
LOL, я то свои данные/знания черпаю из отладки VB прорамм в отладчике, т.ч. я сужу по примеру который писал сам, и сам же его исследовал...

А вот ты откуда данные эти имеешь? Только-ли из собственных соображений ???

Ответить

Номер ответа: 10
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #10
Добавлено: 11.08.04 15:47
Кстати, послу вызова АПИ, всегда идет Call edi, и не дай то бог если эначение этого регистра той АПИ будет изменено, т.ч. твоя логика никуда не годится...

Ответить

Номер ответа: 11
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #11 Добавлено: 11.08.04 15:58
Эти данные я беру из разных источников, в том числе из собственного опыта. Я уже сказал - безопасного способа Multithread'а в VB нет, но вышеперечисленные методы помогают значительно снизить риск крэша. Проверено не только мной. Это статистика.

Ответить

Номер ответа: 12
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #12
Добавлено: 11.08.04 17:36
 Кстати потоки в IDE работают нормально, а грохаются только в экзешнике.
 Отсюда вывод - проблема в виртуальной машине. А следовательно нихрена у вас ребята на VB6 не получится.

 Да, а на PB поток нормально работает с глобальными переменными.

Ответить

Номер ответа: 13
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #13
Добавлено: 11.08.04 21:06
Глобальные переменные никакой опасности для потоков не представляют.

cresta ненароком ошибся, а LOL его и поддержал... Проблемма будет лишь при одновременном доступе... ну да это уже вовсе другая история и для этого сужествуют объекты синхронизации, критические секции и т.д.

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

Ответить

Номер ответа: 14
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #14 Добавлено: 11.08.04 22:59
Мдя, это верно, если доступ к глобальным не синхронизирован - не есть хорошо. Что касается другого языка - вылететь можно везде.Я только что нарвался на это (программа на асме) - попытка считать из одного потока не приготовленное в другом потоке. И ещё один момент, который пока не разобрался. Создается поток.Нормально.Работает тоже нормально. При выходе - вылетает. Случайно обнаружил, что место, откуда вызывается CreateThread имеет какое-то значение. Т.е. перенёс CreateThread в другую процедуру и всё пошло как по маслу. Вот такой прикол. Мож кто знает, что бы это значило?

Ответить

Номер ответа: 15
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #15
Добавлено: 12.08.04 00:39
> Насколько я знаю, в потоках вообще нельзя использовать глобальные переменные.
Ерунда. А как тогда использовать строки в процедурах, выполняющихся в отдельных нитях (нитях, а не потоках! Не юзайте ламерскую терминологию!)? И никаких проблем с одновременным доступом нет, поскольку одновременный доступ на однопроцессорной машине (и на мультипроцессорной тоже, но по другой причине) - это нонсенс. Хотя, конечно, при изменении переменной в нескольких нитях синхронизация необходима.
> Т.е. перенёс CreateThread в другую процедуру и всё пошло как по маслу.
Код в студию!

Ответить

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

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



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