Страница: 1 | 2 |
Вопрос: Многопоточная программа.
Добавлено: 11.08.04 08:09
Автор вопроса: Kolek | ICQ: 6223500
Программа обрабатывает уйму записей. Нужно, чтобы она не стопорилась до конца обработки, а работала и работала. А то просто в стопор уходит и с приездом, жди когда закончит!
Ответы
Всего ответов: 24
Номер ответа: 1
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #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-сайт:
Профиль | | #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-сайт:
Профиль | | #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-сайт:
Профиль | | #9
Добавлено: 11.08.04 15:46
LOL, я то свои данные/знания черпаю из отладки VB прорамм в отладчике, т.ч. я сужу по примеру который писал сам, и сам же его исследовал...
А вот ты откуда данные эти имеешь? Только-ли из собственных соображений ???
Номер ответа: 10
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #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-сайт:
Профиль | | #12
Добавлено: 11.08.04 17:36
Кстати потоки в IDE работают нормально, а грохаются только в экзешнике.
Отсюда вывод - проблема в виртуальной машине. А следовательно нихрена у вас ребята на VB6 не получится.
Да, а на PB поток нормально работает с глобальными переменными.
Номер ответа: 13
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #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-сайт:
Профиль | | #15
Добавлено: 12.08.04 00:39
> Насколько я знаю, в потоках вообще нельзя использовать глобальные переменные.
Ерунда. А как тогда использовать строки в процедурах, выполняющихся в отдельных нитях (нитях, а не потоках! Не юзайте ламерскую терминологию!)? И никаких проблем с одновременным доступом нет, поскольку одновременный доступ на однопроцессорной машине (и на мультипроцессорной тоже, но по другой причине) - это нонсенс. Хотя, конечно, при изменении переменной в нескольких нитях синхронизация необходима.
> Т.е. перенёс CreateThread в другую процедуру и всё пошло как по маслу.
Код в студию!