Выход из потока

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Tarantul
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 13.12.2004 (Пн) 16:39
Откуда: IUnknown

Выход из потока

Сообщение Tarantul » 17.08.2005 (Ср) 17:40

Я сейчас создаю прогу, котрая реально использует многопоточность, в качестве справки использую известный пример (выложено ниже). Но как обнаружилось, через TerminateThread или Exit Sub/Funtion нормально завершить поток нельзя (т.е, в самой IDE после этого завершение проги невозможно, да и в exeшнике примерно то же самое).
Можно ли как то нормально завершить поток, или единственный выход - VB.NET?. Тут где-то писали, что потоки можно реализовать както через ActiveX, но я не хочу с этим мучаться :(

Tarantul
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 13.12.2004 (Пн) 16:39
Откуда: IUnknown

Сообщение Tarantul » 17.08.2005 (Ср) 18:15

Известный пример
Вложения
Multithreading VB6.zip
(15.1 Кб) Скачиваний: 43

Tarantul
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 13.12.2004 (Пн) 16:39
Откуда: IUnknown

Сообщение Tarantul » 17.08.2005 (Ср) 19:54

Что, никто не знает :?: :(

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 17.08.2005 (Ср) 20:32

Ну почему же никто :)
Вот придёт GSerg и поможет. Я так над VB не извращаюсь.
Последний раз редактировалось BV 17.08.2005 (Ср) 21:09, всего редактировалось 1 раз.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 17.08.2005 (Ср) 20:48


Tarantul
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 13.12.2004 (Пн) 16:39
Откуда: IUnknown

Сообщение Tarantul » 17.08.2005 (Ср) 21:27

2 Amed
Дело в том, что фиберы мне не совсем подходят, мне нужно чтобы потоки выполнялись паралельно без переключения на другой вручную

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.08.2005 (Чт) 2:59

Поток завершится сам при возврате из процедуры.
Но всё равно, не надо так делать.

Безопасно и надёжно делать мультитрединг на VB можно примерно так, как я делал в Waiter!'е. Но это большой гемор.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

Сообщение Юстас » 19.08.2005 (Пт) 4:17

Почему нельзя перенести код, создающий поток в dll? Что мешает?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 19.08.2005 (Пт) 9:34

Но как обнаружилось, через TerminateThread или Exit Sub/Funtion нормально завершить поток нельзя


Использовать TerminateThread действительно нельзя. Однако просто выйти из потоковой процедуры можно, поток умрет, и без всяких глюков. Еще, если вдруг не знаешь, компилировать проект нужно в pcode.

Есть три варианта дальнейших действий.

1. Перепроектировать поток так, чтобы он сам завершался, выполнив свою задачу.
2. Использовать в потоке WaitForSingleObject.
3. Передать в поток ссылку на класс со свойством типа ToStop as Boolean, в потоке его проверять, а извне поставить True, когда надо его вырубить.

У каждого способа есть свои недостатки. В первом случае не всегда представляется возможным переделать поток. Во втором, если пауза поставлена подлиннее, WaitForSingleObject подтормаживает поток, а если поменьше, срабатывает не всегда с первого раза. В третьем теоретически могут возникнуть непредсказуемые глюки, связанные с ошибками доступа к памяти. Однажды мне удалось сделать стабильный поток третьим способом, но, к сожалению, исходники потерялись, в любом случае рекомендую его.

А dll, не dll - абсолютно не важно.
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 19.08.2005 (Пт) 9:36

Кстати, пример известный, но бестолковый, есть лучше.
Лучший способ понять что-то самому — объяснить это другому.

Tarantul
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 13.12.2004 (Пн) 16:39
Откуда: IUnknown

Сообщение Tarantul » 19.08.2005 (Пт) 9:49

А не кинеш ссылочку на тот, что получше?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 19.08.2005 (Пт) 10:07

Кинул бы сам пример, был бы он под рукой. Ссылку не помню. А так только в понедельник.
Лучший способ понять что-то самому — объяснить это другому.

Tarantul
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 13.12.2004 (Пн) 16:39
Откуда: IUnknown

Сообщение Tarantul » 19.08.2005 (Пт) 10:18

ОК, спасибо

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Выход из потока

Сообщение Andrey Fedorov » 19.08.2005 (Пт) 11:52

Tarantul писал(а): Можно ли как то нормально завершить поток, или единственный выход - VB.NET?. Тут где-то писали, что потоки можно реализовать както через ActiveX, но я не хочу с этим мучаться :(


Ну я бы рекомендовал не мудрить и в данном случае просто начать все делать на VB.NET - оно будет самому удобнее в дальнейшем и к VB.NET привыкать начнешь - разница не столь уж и большая, главное начать...

Ну а если дюже хочется на VB6 - при желании можно использовать FW и с ним:

http://msdn.microsoft.com/vbrun/vbfusion/usingnet/default.aspx
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 22.08.2005 (Пн) 10:19

Нашел только это, но работает как часы.
Вложения
threading.rar
(4.53 Кб) Скачиваний: 62
Лучший способ понять что-то самому — объяснить это другому.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 134

    TopList