Multithreading

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
f0rbeed
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 18.12.2002 (Ср) 17:51
Откуда: Russia

Сообщение f0rbeed » 07.05.2003 (Ср) 12:25

Это конечно неплохо, но с C++ это уже другое дело. Там то с потоками вообще никаких проблем... Да и с другими делами тоже. 2ASD: А что за компонент для регистрации сервисов? Просто я столкнулся с тем что мне тоже бы это не помешало. 2 Aлександр Андреев: ждем твой проект...
Так быстро, что незаметно...

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 13.05.2003 (Вт) 10:51

Обещанный рассказ о проведенных исследованиях. :D

Действительно, VB поддерживает многопотоковость крайне криво. Приходится искать обходные пути, чтобы ее реализовать.
Один из таких путей - написать DLL на C++, которая бы выполняля вю работу с потоками. Это конечно неудобно, зато не будет падать.

Можно сдалать и в самом VB. Есть много мнений на этот счет. Я предлагаю свое. Итак, нужно придерживаться следующих пунктов:
1. Можно воспользоваться любым из модулей поддержки многопотоковости, что были предложены ранее в этом топике. Они все облекают функцию CreateThread, поэтому особой разницы между ними нет.
2. Управляющую функцию нужно объявлять так:
Код: Выделить всё
Public Function ThreadFunc(Param As Long) As Long

Неплохо также при выходе из нее вернуть какое-нибудь значение (по-моему принято возвращать -1 если все прошло без ошибок).
3. Важно: внутри управляющей функции должны быть только апишные вызовы. Программа становится крайне неустойчива, если встречается хотя-бы одна бейсиковская функция. Кто не верит, может попробовать такой пример:
Код: Выделить всё
Public Function ThreadFunc(Param As Long) As Long

    Call MsgBox "ThreadFunc"

    ThreadFunc = -1
End Function

У меня при этом наблюдалось 100% вылетов.
4. Компилировать надо в P-код.

При соблюдении этих условий программа работает как в IDE, так и будучи скомпилированной. По крайней мере на моей машине (правда она у меня более чем быстрая, может это как-то влияет).
В любом случае, буду признателен за отзывы и замечания.

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 13.05.2003 (Вт) 10:54

Да, вот что забыл...
3.1. Дочерний поток может _безопасно_ обмениваться сообщениями с основным. Для этого можно использовать функцию SendMessage.

ASD
Модератор
Модератор
Аватара пользователя
 
Сообщения: 1758
Зарегистрирован: 07.12.2001 (Пт) 21:08
Откуда: Russia

Сообщение ASD » 13.05.2003 (Вт) 11:12

Компонент Dart ServerTool. ( http://www.dart.com/downloads/ )
Очень недурственно работает.
У меня написан сервис снятия статистики с роутера.
Падений небыло. Умеет писать в EventLog.
Фишки типа регистрации и анрегистрации держит.
Короче хвалю. Незнаю правда на сколко там новая версия на сайте.
У меня возможно постарее но с лекарством от жадности.
Moderator VBStreets
---------------------------

f0rbeed
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 18.12.2002 (Ср) 17:51
Откуда: Russia

Сообщение f0rbeed » 18.05.2003 (Вс) 22:54

2 Александр Андреев: А нельзя ли какой нибудь нормальный работающий пример выслать?
Так быстро, что незаметно...

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 19.05.2003 (Пн) 10:22

В этой теме такой пример уже был чуть пораньше. Там где линия двигалась и барабан стучал. Он, кстати, всем моим требованиям удовлетворяет. :)

Nikita
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 05.02.2003 (Ср) 15:09
Откуда: Russia

Сообщение Nikita » 05.06.2003 (Чт) 14:41

А как передавать сообщения потоку? SendMessage - а подробнее?
Поток выполняет функцию, хочется изменять переменные в этой функции, и тп.

Пред.

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

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

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

    TopList