Использование мьютексов в многопоточном VB6 - PullRequest
1 голос
/ 20 июля 2010

Я обновляю устаревший код, написанный на VB6, и столкнулся с необходимостью мьютекса. У меня есть два сокета, и мне нужно отправлять и получать из разных источников. Поэтому я планирую, чтобы один сокет непрерывно прослушивал входящие соединения, а другой - для отправки или получения.

Таймер проверяет двадцать раз в секунду, установилось ли соединение, и, если это так, использует второй сокет для его принятия, а затем сразу же начинает прослушивание. Если второе соединение приходит до того, как первое завершило получение данных, ему нужно подождать (в C # я бы наложил на него блокировку и вызвал бы его выполненным).

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

Я не знаком с многопоточностью в VB6 - это проблема, или событие Tick таймера всегда возникает в том же потоке, что и все остальное?

Ответы [ 2 ]

4 голосов
/ 21 июля 2010

Событие Tick всегда вызывается в одном и том же потоке.Все автоматически блокируется, потому что есть только один поток.

Многопоточность в VB6 на самом деле не работает, кроме с использованием проекта ActiveX EXE: есть различных хаков , чтобы заставить работать многопоточность, но они звучат плохо для меня, хотя другие люди клянутся ими.

3 голосов
/ 21 июля 2010

Если вы используете стандартный элемент управления winsock VB6, вам не нужно даже беспокоиться об использовании таймера, события будут срабатывать при установлении соединения (и да, это в основном потоке).Единственное, с чем вы должны быть очень осторожны в отношении «блокировок», это то, что вы можете попасть в плохую ситуацию, если у вас есть DoEvents в вашем коде, так как это накачивает цикл обработки сообщений и вы можете получить код из других функций, выполняющихся в серединефункция, которая вызывает DoEvents.Если вам нужны DoEvents, чтобы ваша программа реагировала, вы можете использовать простые логические значения в качестве блокировок, так как VB6 не является многопоточным.И MarkJ прав, вы должны очень далеко уйти и делать очень схематичные вещи, чтобы VB6 стал многопоточным, без использования ActiveX EXE-проекта.

...